zoukankan      html  css  js  c++  java
  • django基础篇05-Form验证组件

    Django的Form主要具有一下几大功能:

    • 生成HTML标签
    • 验证用户数据(显示错误信息)
    • HTML Form提交保留上次提交数据
    • 初始化页面显示内容

    基本简单的操作:

    from django import forms
    
    class FM(forms.Form):
        # 根据form表单中的name来做
        username = fields.CharField(
            error_messages={'required':'用户名不能为空'},
        )
        pwd = fields.CharField(
            error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
            min_length=6,
            max_length=12,
        )
        email = fields.EmailField(
            error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'}
        )
        
    Form.py
    def index(request):
        if request.method == 'GET':
            # 解决错误提示后内容清空的问题
            obj = FM()
            return render(request,'form_index.html',{'obj': obj})
        elif request.method == 'POST':
            # 获取用户所有数据
            # 每条数据请求验证
            # 成功:获取用户提交的数据
            # 失败:显示错误信息
            obj = FM(request.POST)
            # 验证是否合法
            ret = obj.is_valid()
            if ret:
                print('obj.clean****',obj.clean())
                print('obj.clead_data*****',obj.cleaned_data)
            else:
                print('obj.errors****',obj.errors)
                print('obj.errors.as_json()*****',obj.errors.as_json())
                print('obj****',obj)
                # from django.forms.utils import ErrorDict
                # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
                print(type(obj.errors))
            return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
    Views.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>form验证组件</title>
        <style>
            .usernameTF{
                background-color: coral;
                color: aqua;
            }
        </style>
    </head>
    <body>
    
        <form action="/form_app/index" method="post">
            {% csrf_token %}    
            <p><input type='text' name='username'/> {{ error_msg.username.0 }}</p>
            <p><input type='text' name='pwd'/>      {{ error_msg.pwd.0 }}</p>
            <p><input type='text' name='email'/>    {{ error_msg.email.0 }}</p>
            <p><input type="submit" value="提交"></p>
        </form>
    
    </body>
    </html>
    form_index.html

    进阶操作:

    主要涉及widget的使用、初始化默认值,以及记录上次填写的值

    from django import forms
    from django.forms import widgets
    from django.forms import fields
    
    
    class FM(forms.Form):
        # 根据form表单中的name来做
        username = fields.CharField(
            error_messages={'required':'用户名不能为空'},
            widget=widgets.Textarea(attrs={'class':'usernameTF'})
        )
        pwd = fields.CharField(
            error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
            min_length=6,
            max_length=12,
            widget=widgets.PasswordInput
        )
        email = fields.EmailField(error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'})
    Forms
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>form验证组件</title>
        <style>
            .usernameTF{
                background-color: coral;
                color: aqua;
            }
        </style>
    </head>
    <body>
    
        <form action="/form_app/index" method="post">
            {% csrf_token %}
            <p>{{ obj.username }} {{ error_msg.username.0 }}</p>
            <p>{{ obj.pwd }}      {{ error_msg.pwd.0 }}</p>
            <p>{{ obj.email }}    {{ error_msg.email.0 }}</p>
            <p>{{ obj.user }}</p>
            <p><input type="submit" value="提交"></p>
        </form>
    
    </body>
    </html>
    form_index.html
    def index(request):
        if request.method == 'GET':
            # 加载默认值
            initial_dic = {
                'username': 'root',
                'pwd': '12345678',
                'email': '953995648@qq.com',
                'user': True
            }
    
            obj = FM(initial_dic)
            return render(request,'form_index.html',{'obj': obj})
        elif request.method == 'POST':
            # 获取用户所有数据
            # 每条数据请求验证
            # 成功:获取用户提交的数据
            # 失败:显示错误信息
            obj = FM(request.POST)
            # 验证是否合法
            ret = obj.is_valid()
            if ret:
                print('obj.clean****',obj.clean())
                print('obj.clead_data*****',obj.cleaned_data)
            else:
                print('obj.errors****',obj.errors)
                print('obj.errors.as_json()*****',obj.errors.as_json())
                print('obj****',obj)
                # from django.forms.utils import ErrorDict
                # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
                print(type(obj.errors))
            return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
    Views.py

    在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

    方式一:

    from django.forms import Form
    from django.forms import widgets
    from django.forms import fields
    from django.core.validators import RegexValidator
     
    class MyForm(Form):
     
        user = fields.ChoiceField(
            # choices=((1, '上海'), (2, '北京'),),
            initial=2,
            widget=widgets.Select
        )
     
        def __init__(self, *args, **kwargs):
            super(MyForm,self).__init__(*args, **kwargs)
            # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
            #
            self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

    方式二:

    使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现

    from django import forms
    from django.forms import fields
    from django.forms import widgets
    from django.forms import models as form_model
    from django.core.exceptions import ValidationError
    from django.core.validators import RegexValidator
     
    class FInfo(forms.Form):
        authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
        # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
  • 相关阅读:
    前端之CSS盒模型介绍
    前端之CSS列表及背景类属性
    前端之CSS字体和文本类属性
    流程控制语句
    前端之CSS语法及选择器
    前端之CSS创建的样式
    前端之HTML语法及常用标签
    前端之HTML样式
    网页制作之前端简介
    jQuery(一)、核心
  • 原文地址:https://www.cnblogs.com/it-q/p/9409849.html
Copyright © 2011-2022 走看看