• Django forms组件


    一.编写表单类

    通过Django提供的Form类来生成表单
    注意事项:

    • 提前导入forms模块:from django import forms
    • 所有的表单类都要继承forms.Form类
    • 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的
      元素中的表单元素。
    • 字段中拥有不同的属性
    from django import forms
    class MyForm(forms.Form):
        name = forms.CharField(max_length=10,min_length=3,label='用户名')
        pwd = forms.CharField(max_length=10,min_length=3,label='密码')
        email = forms.CharField(label='邮箱')
    
    #使用时实例化产生一个对象,传入要校验的数据(字典)
    myform = MyForm(request.POST)
    

    二.渲染模板

    第一种方式:可扩展性最高

    <form action="" method="post" >
        <p>用户名: {{ myform.name }}</p>
        <p>密码: {{ myform.pwd }}</p>
        <p>邮箱: {{ myform.email }}</p>
        <input type="submit" value="提交">
    </form>
    

    第二种方式:for循环form对象

    <form action="" method="post" >
        {% for foo in myform %}
        <p>{{ foo.label }}:{{ foo }}</p>
        {% endfor %}
        <input type="submit" value="提交">
    </form>
    

    第三种方式:可扩展性最差,不推荐使用

    <form action="" method="post" >
        {#{{ myform.as_p }}#}
        {{ myform.as_ul }}
        <input type="submit" value="提交">
    </form>
    

    三.渲染错误信息

    视图层

    def register(request):
    
        if request.method=="POST":
            form=UserForm(request.POST)
            if form.is_valid():
                print(form.cleaned_data)       # 所有干净的字段以及对应的值
            else:
                print(form.cleaned_data)       #
                print(form.errors)             # ErrorDict : {"校验错误的字段":["错误信息",]}
                print(form.errors.get("name")) # ErrorList ["错误信息",]
            return render(request,"register.html",locals())
        form=UserForm()
        return render(request,"register.html",locals())
    

    模板层

    <form action="" method="post" novalidate>
        {% csrf_token %}
        
        {% for field in form %}
            <div>
                <label for="">{{ field.label }}</label>
                {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
            </div>
        {% endfor %}
        <input type="submit" class="btn btn-default">
    
    </form>
    

    四.field常用的属性

    1.field.label           字段对应的label信息
    2.field.label_tag       自动生成字段的label标签,注意与{{ field.label }}的区别。
    3.field.value           当前字段的值,比如一个Email字段的值someone@example.com
    4.field.errors          包含错误信息的元素
    5.field.is_hidden       用于判断当前字段是否为隐藏的字段,如果是,返回True
    6.field.field           返回字段的参数列表。例如{{ char_field.field.max_length }}
    7.field.help_text       字段的帮助信息
    

    五. 使用表单验证数据

    1. Form.clean()

    如果你要自定义验证功能,那么你需要重新实现这个clean方法。

    1. Form.is_valid()

    调用is_valid()方法来执行绑定表单的数据验证工作,并返回一个表示数据是否合法的布尔值。

    >>> data = {'subject': 'hello',
    ...         'message': 'Hi there',
    ...         'sender': 'foo@example.com',
    ...         'cc_myself': True}
    >>> f = ContactForm(data)
    >>> f.is_valid()
    True
    

    让我们试下非法的数据。下面的情形中,subject为空(默认所有字段都是必需的)且sender是一个不合法的邮件地址:

    >>> data = {'subject': '',
    ...         'message': 'Hi there',
    ...         'sender': 'invalid email address',
    ...         'cc_myself': True}
    >>> f = ContactForm(data)
    >>> f.is_valid()
    False
    
    1. Form.errors

    表单的errors属性保存了错误信息字典:

    >>> f.errors
    {'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}
    

    在这个字典中,键为字段的名称,值为错误信息的Unicode字符串组成的列表。错误信息保存在列表中是因为字段可能有多个错误信息。

    1. Form.errors.as_data()

    返回一个字典,它将字段映射到原始的ValidationError实例。

    >>> f.errors.as_data()
    {'sender': [ValidationError(['Enter a valid email address.'])],
    'subject': [ValidationError(['This field is required.'])]}
    
    1. Form.errors.as_json(escape_html=False)

    返回JSON序列化后的错误信息字典。

    >>> f.errors.as_json()
    {"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
    "subject": [{"message": "This field is required.", "code": "required"}]}
    
    1. Form.add_error(field, error)

    向表单特定字段添加错误信息。

    field参数为字段的名称。如果值为None,error将作为Form.non_field_errors()的一个非字段错误。

    1. Form.has_error(field, code=None)

    判断某个字段是否具有指定code的错误。当code为None时,如果字段有任何错误它都将返回True。

    1. Form.non_field_errors()

    返回Form.errors中不是与特定字段相关联的错误。

    六.局部钩子

    rom django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    def clean_name(self):
    	val=self.cleaned_data.get("name")
    	ret=UserInfo.objects.filter(name=val)
    	if not ret:
    		return val
    	else:
    		raise ValidationError("该用户已注册!")
    
    def clean_tel(self):
    	val=self.cleaned_data.get("tel")
    	if len(val)==11:
    		return val
    	else:
    		raise  ValidationError("手机号格式错误")
    

    七.全局钩子

    def clean(self):
    	pwd=self.cleaned_data.get('pwd')
    	r_pwd=self.cleaned_data.get('r_pwd')
    
    	if pwd and r_pwd:
    		if pwd==r_pwd:
    			return self.cleaned_data
    		else:
    			raise ValidationError('两次密码不一致')
    	else:
    
    		return self.cleaned_data
    
  • 相关阅读:
    c#异步执行方法
    sql 增加、修改、删除触发器小例子
    c#解决高并发加锁(Lock)
    sql中写事物和c#中执行事物
    socket 服务器浏览器与服务器客户端实例
    c# 写txt
    vs2003 序列化json
    一个完整的Windows 服务从创建到安装卸载
    js封装长度验证
    jquery 右下角弹出框
  • 原文地址:https://www.cnblogs.com/louyefeng/p/10003730.html
Copyright © 2020-2023  润新知