Django form表单类与表单校验

表单可以提交数据,表单还需要做校验

假设我们需要以下的字段校验

用户名:至少6位,不能有特殊符号

密码: 数字字母混合

邮箱: 邮箱格式

电话号: 11数字

身份证: 校验接口

我们可以用前端进行校验。开发难度较低,但是前端校验不能完全防止错误数据,应为有些请求是可 以不经过网页的,所以一个安全的注册需要前后端共同校验。后端校验最简单的方法。

def formExa(request):
    if request.method == "POST" and request.POST:
        name = request.POST.get("name")
        if name:
            description = request.POST.get("description")
            Type.objects.create(label = name,description = description)
            types = Type.objects.all()
        else:
            return render(request,"index.html")
    return render(request,"formTem.html",locals())

上面的方法很直观,但是不适合处理大量的校验,django为了解决这个问题,推出了Form类。

Django form表单的定义:

在app当中创建一个forms.py脚本

1、手动定义

from django import forms

class AuthorForm(forms.Form):
    name = forms.CharField(max_length = 32)
    age = forms.IntegerField()
    birthday = forms.DateField()
    email = forms.EmailField()
    phone = forms.CharField(max_length = 32)
    photo = forms.ImageField()
    address = forms.Textarea()

2、来自于模型

from Article.models import Author
class AuthorForm_v2(forms.ModelForm):
    class Meta:
        model = Author
        fields = "__all__"

前端效果

1、直接使用

2、As_p

3、As_ul

4、As_table(已经失效)

5、循环使用

<form class="form">
<p>+++++++++++++++as_p+++++++++++++++++++</p>
{{ authorForm.as_p }}
<p>+++++++++++++++as_ul+++++++++++++++++++</p>
{{ authorForm.as_ul }}
<p>++++++++++++++++as_table++++++++++++++++++</p>
{{ authorForm.as_table }}
</form>
<p>++++++++++++++++循环式样式++++++++++++++++++</p>
<form>
     {% for field in authorForm %}
         <p>
            <label style="color: #3b3b1f">{{ field.label }}</label>
            {{ field }}
         </p>
     {% endfor %}
</form>

Form类表单的修饰   

Required 字段是否可以为空 True

Max_length 最大长度

Min_length 最小长度

Label 标签

Initial 初始值

Help_text 帮助文本

Error_message 错误信息

Disabled 是否可以被修改

Widget 添加前端样式

class AuthorForm(forms.Form):
    name = forms.CharField(max_length = 8,required=False,min_length = 6,label = "作者姓名")
    age = forms.IntegerField(label = "作者年龄")
    birthday = forms.DateField(label = "作者生日")
    email = forms.EmailField(label = "作者邮箱")
    phone = forms.CharField(max_length = 32,label = "作者电话",widget=forms.TextInput(attrs={"style":"color:red;"}))
    # photo = forms.ImageField()
    address = forms.Textarea()
    def clean_name(self): #名称必须是clean_要校验的字段名
        name = self.cleaned_data.get("name")
        if "管理员" in name:
            self.add_error("name","非法命名")
        else:
            return name

Form表单的校验

1、校验步骤

1、获取前端提交的数据,并将数据传递form类当中

2、使用form类实例的is_valid方法进行校验

3、使用form类实例的clean_data获取校验过的数据,errors方法获取校验发生的错误

from Article.froms import AuthorForm,AuthorForm_v2
def formClass(request):
    authorForm = AuthorForm() #实例化空的表单,提交到前端给用户使用
    if request.method == "POST" and request.POST:
        validData = AuthorForm(request.POST) #使用form类对提交回来的数据进行后端校验  --->1<----
        if validData.is_valid(): #is_valid 校验没有错误返回True否则False --->2<----
            cleanData = validData.cleaned_data #按照字典返回 --->3<----
        else:
            cleanData = validData.errors --->3<----
    return render(request,"FormClass.html",locals())

2、自定义校验

1、自定义校验的方法名称必须是clean_校验字段的名称

2、通过self.clean_data方法获取校验字典的具体值

3、如果发生错误使用self.add_error(“字段名称”,”错误内容”)添加错误

from django import forms

class AuthorForm(forms.Form):
    name = forms.CharField(max_length = 8,required=False,min_length = 6,label = "作者姓名")
    age = forms.IntegerField(label = "作者年龄")
    birthday = forms.DateField(label = "作者生日")
    email = forms.EmailField(label = "作者邮箱")
    phone = forms.CharField(max_length = 32,label = "作者电话",widget=forms.TextInput(attrs={"style":"color:red;"}))
    # photo = forms.ImageField()
    address = forms.Textarea()
    def clean_name(self): #名称必须是clean_要校验的字段名  --->1<---
        name = self.cleaned_data.get("name")  --->2<---
        if "管理员" in name:
            self.add_error("name","非法命名") --->3<---
        else:
            return name

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/89455349
今日推荐