form校验组件

form校验组件

导包:

from django import forms
from django.forms import widgets

定义类:

class MyForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=8, label='用户名:', error_messages={
        'min_length': '最少3位',
        'max_length': '最多8位',
        'required': '用户名不可以为空'
    }, widget=widgets.TextInput(attrs={'class': 'form-control'}))  # 可以添加样式
    password = forms.CharField(min_length=3, max_length=8, label='密码:', error_messages={
        'min_length': '最少3位',
        'max_length': '最多8位',
        'required': '密码不可以为空'
    }, widget=widgets.PasswordInput(attrs={'class': 'form-control'}))
    email = forms.EmailField(error_messages={
        'required': '你的邮箱不可以是空的',
        'invalid': '邮箱格式不正确'
    }, required=False, widget=widgets.EmailInput(attrs={'class': 'form-control'}))

    # 局部钩子
    def clean_username(self):
        if 'a' in self.cleaned_data.get('username'):
            self.add_error('username', '含有敏感词汇')
        return self.cleaned_data.get('username')

    # 全局钩子
    def clean(self):
        # 可以用来比较两个框里的东西
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        if username != password:
            self.add_error('password', '账号密码必须一样')
        return self.cleaned_data

类中的字段属性

min_length: 最少多少位

max_length: 最多多少位

widget=widgets.类型Input() : 更改标签类型,还有好多中,单选按钮,复选, 下拉框

widget=widgets.TextInput(attrs={'class': 'form-control'})): 可以添加标签

error_messages: 更改错误提示信息

required:

  • 在error_messages中使用:为空提示信息
  • 不在error_messages中使用: required=False 为空不提示报错

invalid: 邮箱格式

类中的方法

局部钩子

格式:

def clean_标签的name(self):
    ...

必须有返回值,拿什么返回什么

  • 通过cleaned_data拿到符合条件的数据,对数据进行进一步处理

    username = self.cleaned_data.get('username')

  • 在通过add_error('username', '你这个数据不符合我的处理条件,回去吧')这样添加对应的返回显示在前端的提示语句.

  • 最后要 return username

全局钩子

格式:

def clean(self):
    ...

也是必须有返回值,拿什么返回什么

  • 通过cleaned_data拿到符合条件的数据,对数据进行进一步处理

    password= self.cleaned_data.get('password')

    re_pwd= self.cleaned_data.get('re_pwd')

  • 这个的逻辑处理是比较两个框传过来的值,而不是对单一的传过来的值处理(例如: 注册的时候校验两次输入的密码)

  • 也是通过add_error('username', '你这个数据不符合我的处理条件,回去吧')这样添加对应的返回显示在前端的提示语句.

  • 最后返回的是 return self.cleaned_data

视图函数

def form_test(request):
    form_obj = MyForm()
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        email = request.POST.get('email')
        form_obj = MyForm({'username': username, 'password': password,'email': email})
        
    return render(request, 'form_test.html', locals())

前端显示的三种格式

第一种

这种是直接把input框放进p标签里面,并且根据后端的类里的数据个数去创建对应个数标签
{{ form_obj.as_p }}
这种是直接把input框放进ul标签里面,并且根据后端的类里的数据个数去创建对应个数标签
{{ form_obj.as_ul }}   

第二种

<p>
	{{ form_obj.username.label }}{{ form_obj.username }}
</p>
	<span>{{ form_obj.username.errors.0 }}</span>
<p>
	{{ form_obj.password.label }}{{ form_obj.password }}
</p>
	<span>{{ form_obj.username.errors.0 }}</span>

第三种(推荐使用)

{% for foo in form_obj %}
	<p>
		{{ foo.label }}{{ foo }}
		<span>{{ foo.errors.0 }}</span>
	</p>
{% endfor %}
原文地址:https://www.cnblogs.com/xiongchao0823/p/11762262.html