Django Form组件

Posted kai-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Form组件相关的知识,希望对你有一定的参考价值。

Form组件

介绍

我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.

Django form组件就实现了上面所述的功能。

总结一下,其实form组件的主要功能如下:

  • 生成页面可用的HTML标签 --->渲染页面(生成HTML标签功能)
  • 对用户提交的数据进行校验 --->校验数据(对用户提交的数据进行校验,并返回校验结果)
  • 保留上次输入内容 --->展示信息( 当用户输错之后 再次输入 上次的内容还保留在input框)



如何使用Form组件

先定义一个RegForm类

views.py  检验数据

def login(request):
    # 1  先生成一个空的类对象
    form_obj = MyRegForm()
    if request.method == 'POST':
        # 3  实例化form对象的时候,把post提交过来的数据交给forms组件校验  request.POST
        form_obj = MyRegForm(request.POST)
        # 4  获取校验结果
        if form_obj.is_valid():
            return HttpResponse('格式正确')
        else:
            # 5 获取校验失败的字段和提示信息
            print(form_obj.errors)
    # 2  直接将该对象传给前端页面
    return render(request, 'login.html', locals())


from django import forms

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4)
    password = forms.CharField(max_length=9, min_length=4)
    # email字段控制了input输入框必须为邮箱格式
    email = forms.EmailField()
login.html

{#form表单取消前端浏览器自动校验功能   novalidate #}
<form action="" method="post" novalidate> 
    {% for form in form_obj %}
    <p>
        {{ form.label }}{{ form }}
        <span>{{ form.errors.0 }}</span>
    </p>
    {% endfor %}
    <input type="submit">
</form>

检验数据

校验数据,即获取前端的输入,并根据类中定义该标签时的参数进行校验,根据校验结果处理响应

1、后端实例化一个空的对象form_obj,交给前端渲染成form表单

2、前端form表单提交数据,数据格式是字典

3、数据字典传给类,实例化生成一个对象,与1中的空对象同名form_obj

4、根据对象form_obj的校验结果返回响应数据

通过对象绑定方法is_valid判断数据校验结果是否通过

只有所有数据校验通过的情况下,is_valid才为True

内置校验器

from django.core.validators import RegexValidator
from django import forms
class MyForm(forms.Form):
    user = forms.CharField(
        validators=[
        RegexValidator(r'^[0-9]+$', '请输入数字'), 
        RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )

Form常用字段

initial

初始值,input框里面的初始值

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4,
                               label='用户名:',
                               initial= 'Santa',
                               )
    password = forms.CharField(max_length=9, min_length=4, label='密码:')
    # email字段控制了input输入框必须为邮箱格式
    email = forms.EmailField()

error_messages

重写错误信息

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4,
                               label='用户名:',
                               initial= 'Santa',
                               error_messages={
                                   'max_length': "用户名最长9位",
                                   'min_lengyh': "用户名最短4位",
                                   'required': "用户名不能为空",
                                   'invalid': "格式错误"
                               })

password

密文

password = forms.CharField(max_length=9, min_length=4, label='密码:',
                           widget=forms.widgets.PasswordInput(
                               {'class': 'c1'}, render_value=True
                           ))  # 以attrs={key:value}的方式设置标签属性

required

是否为空

class MyRegForm(forms.Form):
    username = forms.CharField(max_length=9, min_length=4,
                               error_messages={
                                   'required': "用户名不能为空",
                                   'invalid': "格式错误"
                               })

CheckboxInput:单选按钮

CheckboxSelectMultiple:多选按钮

Radioselect:单选框

Select:下拉单选框

SelectMultiple:下拉多选框

class MyForm(forms.Form):
    username = forms.CharField(
        max_lenget=8,
        min_length=3,
        widget=forms.widgets.TextInput(attrs={"class": "form-control"})  # 文本输入框,默认
        widget=forms.widgets.PasswordInput(attrs={"class": "form-control"})   # 密文输入框       
    )



钩子函数

全局钩子(针对多个字段)

校验密码与确认密码是否一致

在MyForm中定义clean()方法,实现对字段的全局校验

class MyRegForm(forms.Form):
    ...
  # 全局钩子
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password  = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password', '两次密码不一致')
            return self.cleaned_data

局部钩子(针对单个字段)

检验用户中不能包含敏感词

在MyForm中定义clean_字段名()方法,实现对特定字段的校验

class MyRegForm(forms.Form):
    ...
  # 局部钩子
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if '666' in username:
            self.add_error('username', '不能带666')
            return username



以上是关于Django Form组件的主要内容,如果未能解决你的问题,请参考以下文章

Django—分页器与form组件

Django框架之Form组件

Django Form 组件

Django高级-Form表单组件应用

Django(十五)Form组件

西游之路——python全栈——Django的form组件初识