加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django之form组件

发布时间:2020-12-15 17:17:18 所属栏目:大数据 来源:网络整理
导读:table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0" tr tdspan style="font-size: 16px;" 一、简介 /td /tr /table web框架中避免不了对表单的验证,我们可以通过js在表单数据提交前做一次校验,然而在Dja
<tr>
<td><span style="font-size: 16px;">一、简介</td>
</tr></table>

web框架中避免不了对表单的验证,我们可以通过js在表单数据提交前做一次校验,然而在Django中form组件不仅仅提供验证功能,还可以生成HTML,还可以与model结合使用,等等强大的功能。

先了解下主要的作用:

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

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

1.创建form类

django.forms django.forms django.forms =fields.CharField( widget=widgets.TextInput(attrs={:,: min_length=6={:,:===24={:,:=={:,:

2.views函数处理

.cmdbforms myform request.method===myform() render(request,,{:obj}) request.method=== obj.is_valid(): (obj.clean()) (obj.cleaned_data) redirect((obj.errors.as_json()) render(request,{:obj})

3.HTML模板

Title {{ obj.user }} {{ obj.user.errors.0 }}{{ obj.pwd }} {{ obj.pwd.errors.0 }} {{ obj.email }} {{ obj.email.errors.0 }}

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">三、form类中的字段和插件介绍</td>
</tr></table>

?创建Form类时,主要涉及到字段(fields)和插件(widgets),字段用于对用户请求数据的验证,插件用于自动生成HTML。

1、Django内置字段

======None,错误信息 {: ,: =====CharField(Field)
max_length
=<span style="color: #000000;">None,最大长度
min_length
=<span style="color: #000000;">None,最小长度
strip
=<span style="color: #000000;">True 是否移除用户输入空白

IntegerField(Field)
max_value=<span style="color: #000000;">None,最大值
min_value=<span style="color: #000000;">None,最小值

FloatField(IntegerField)
...

DecimalField(IntegerField)
max_value=<span style="color: #000000;">None,最小值
max_digits=<span style="color: #000000;">None,总长度
decimal_places=<span style="color: #000000;">None,小数位长度

BaseTemporalField(Field)
input_formats=<span style="color: #000000;">None 时间格式化

DateField(BaseTemporalField) 格式:2015-09-01<span style="color: #000000;">
TimeField(BaseTemporalField) 格式:11:12<span style="color: #000000;">
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12<span style="color: #000000;">

DurationField(Field) 时间间隔:%d %H:%M:%S.%<span style="color: #000000;">f
...

RegexField(CharField)
regex,自定制正则表达式
max_length=<span style="color: #000000;">None,最小长度
error_message=None,忽略,错误信息使用 error_messages={<span style="color: #800000;">'<span style="color: #800000;">invalid<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">...<span style="color: #800000;">'<span style="color: #000000;">}

EmailField(CharField)
...

FileField(Field)
allow_empty_file=<span style="color: #000000;">False 是否允许空文件,文件也在clean_data里

ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype=<span style="color: #800000;">"<span style="color: #800000;">multipart/form-data<span style="color: #800000;">"

  • view函数中 obj =<span style="color: #000000;"> MyForm(request.POST,request.FILES)

URLField(Field)
...

BooleanField(Field)
...

NullBooleanField(BooleanField)
...

ChoiceField(Field)
...
choices=(),选项,如:choices = ((0,<span style="color: #800000;">'<span style="color: #800000;">上海<span style="color: #800000;">'),(1,<span style="color: #800000;">'<span style="color: #800000;">北京<span style="color: #800000;">'<span style="color: #000000;">),)
required=<span style="color: #000000;">True,是否必填
widget=<span style="color: #000000;">None,插件,默认select插件
label=<span style="color: #000000;">None,Label内容
initial=<span style="color: #000000;">None,初始值
help_text=<span style="color: #800000;">''<span style="color: #000000;">,帮助提示

ModelChoiceField(ChoiceField)
... django.forms.models.ModelChoiceField
queryset,<span style="color: #008000;">#<span style="color: #008000;"> 查询数据库中的数据
empty_label=<span style="color: #800000;">"<span style="color: #800000;">---------<span style="color: #800000;">",<span style="color: #008000;">#<span style="color: #008000;"> 默认空显示内容
to_field_name=None,<span style="color: #008000;">#<span style="color: #008000;"> HTML中value的值对应的字段
limit_choices_to=None <span style="color: #008000;">#<span style="color: #008000;"> ModelForm中对queryset二次筛选
<span style="color: #000000;">
ModelMultipleChoiceField(ModelChoiceField) <span style="color: #008000;">#多选
... django.forms.models.ModelMultipleChoiceField

TypedChoiceField(ChoiceField)
coerce = <span style="color: #0000ff;">lambda<span style="color: #000000;"> val: val 对选中的值进行一次转换
empty_value= <span style="color: #800000;">''<span style="color: #000000;"> 空值的默认值

MultipleChoiceField(ChoiceField)
...

TypedMultipleChoiceField(MultipleChoiceField)
coerce = <span style="color: #0000ff;">lambda<span style="color: #000000;"> val: val 对选中的每一个值进行一次转换
empty_value= <span style="color: #800000;">''<span style="color: #000000;"> 空值的默认值

ComboField(Field)
fields=<span style="color: #000000;">() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
fields.ComboField(fields=[fields.CharField(max_length=20<span style="color: #000000;">),fields.EmailField(),])

MultiValueField(Field)
PS: 抽象类,只能被继承,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用

SplitDateTimeField(MultiValueField)
input_date_formats=None,格式列表:[<span style="color: #800000;">'<span style="color: #800000;">%Y--%m--%d<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%m%d/%Y<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%m/%d/%y<span style="color: #800000;">'<span style="color: #000000;">]
input_time_formats=None 格式列表:[<span style="color: #800000;">'<span style="color: #800000;">%H:%M:%S<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%H:%M:%S.%f<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">%H:%M<span style="color: #800000;">'<span style="color: #000000;">]

FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
path,文件夹路径
match=<span style="color: #000000;">None,正则匹配
recursive=<span style="color: #000000;">False,递归下面的文件夹
allow_files=<span style="color: #000000;">True,允许文件
allow_folders=<span style="color: #000000;">False,允许文件夹
required=<span style="color: #000000;">True,widget=<span style="color: #000000;">None,label=<span style="color: #000000;">None,initial=<span style="color: #000000;">None,help_text=<span style="color: #800000;">''<span style="color: #000000;">

GenericIPAddressField
protocol=<span style="color: #800000;">'<span style="color: #800000;">both<span style="color: #800000;">'<span style="color: #000000;">,both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1<span style="color: #000000;">, PS:protocol必须为both才能启用

SlugField(CharField) 数字,字母,下划线,减号(连字符)
...

UUIDField(CharField) uuid类型
...
注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串

2、Django内置插件

3、常用插件示例

<span style="color: #008000;">#<span style="color: #008000;"> 单radio,值为字符串<span style="color: #008000;">

<span style="color: #008000;"> user = fields.ChoiceField(<span style="color: #008000;">

<span style="color: #008000;"> choices=((1,),<span style="color: #008000;">

<span style="color: #008000;"> initial=2,<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.RadioSelect<span style="color: #008000;">

<span style="color: #008000;"> )

<span style="color: #008000;">#<span style="color: #008000;"> 单select,值为字符串<span style="color: #008000;">

<span style="color: #008000;"> user = fields.CharField(<span style="color: #008000;">

<span style="color: #008000;"> initial=2,<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.Select(choices=((1,))<span style="color: #008000;">

<span style="color: #008000;"> )

<span style="color: #008000;">#<span style="color: #008000;"> 单select,值为字符串<span style="color: #008000;">

<span style="color: #008000;"> user = fields.ChoiceField(<span style="color: #008000;">

<span style="color: #008000;"> choices=((1,<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.Select<span style="color: #008000;">

<span style="color: #008000;"> )

<span style="color: #008000;">#<span style="color: #008000;"> 多选select,值为列表<span style="color: #008000;">

<span style="color: #008000;"> user = fields.MultipleChoiceField(<span style="color: #008000;">

<span style="color: #008000;"> choices=((1,<span style="color: #008000;">

<span style="color: #008000;"> initial=[1,],<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.SelectMultiple<span style="color: #008000;">

<span style="color: #008000;"> )

<span style="color: #008000;">#<span style="color: #008000;"> 单checkbox<span style="color: #008000;">

<span style="color: #008000;"> user = fields.CharField(<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.CheckboxInput()<span style="color: #008000;">

<span style="color: #008000;"> )

<span style="color: #008000;">#<span style="color: #008000;"> 多选checkbox,值为列表<span style="color: #008000;">

<span style="color: #008000;"> user = fields.MultipleChoiceField(<span style="color: #008000;">

<span style="color: #008000;"> initial=[2,<span style="color: #008000;">

<span style="color: #008000;"> choices=((1,<span style="color: #008000;">

<span style="color: #008000;"> widget=widgets.CheckboxSelectMultiple<span style="color: #008000;">

<span style="color: #008000;"> )

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">四、初始化数据</td>
</tr></table>

?很多时候,我们在一个页面上做增删改查的时候,需要从数据库中将数据拿出来并在页面渲染,那么这些默认值可以使用form直接生成在页面上

方法一:定义form字段中使用

1.form类定义

django.forms django.forms django.forms django.core.validators ===((1,),(3,===[2, choices=((1,),=widgets.CheckboxSelectMultiple(),

2、views函数处理

.myform =::2:1 request.method===appfm(user_dict) render(request,,{:obj})

3、html模版

Title

?方法二:重写form构造方法,在实例化时候设置默认值(该方法是动态的),form定义如下:

===[1=((1,widget= (self,*args,**(*args,**]=[1,2]

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">五、form操作动态select标签</td>
</tr></table>

场景:当我们在数据库中增加一条数据时候,使用form生成的html标签中的select表现需要是最新数据,所以我们需要在渲染模板之前再次从数据库中获取最新数据。

方式一:form实例化之后,通过修改生成的form对象中封装的choices字段重新赋值,确保是当前最新数据,示例:

form定义

django.forms django.forms django.forms cmdb =fields.CharField( widget=widgets.TextInput(attrs={:,min_length=6: user_type==models.Usertype.objects.values_list(,), widget=

views函数

.cmdbforms myform request.method===myform() obj.fields[].choices=models.Usertype.objects.values_list(,) render(request,{:obj})

html模板

> > Title
method= enctype=>% csrf_token %

{{ obj.user }} {{ obj.user.errors.0 }}

{{ obj.pwd }} {{ obj.pwd.errors.0 }}

{{ obj.email }} {{ obj.email.errors.0 }}

{{ obj.user_type }}

value=/>

?方式二:实例化之前,通过重新构造方法,使得每一次的实例化都获得最新的数据

form定义

django.forms django.forms django.forms cmdb =fields.CharField( widget=widgets.TextInput(attrs={:,: user_type=fields.ChoiceField( choices===fields.CharField(widget=widgets.Select(choices=[]))
<span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__init__</span>(self,**<span style="color: #000000;"&gt;kwargs):
    super(myform,**<span style="color: #000000;"&gt;kwargs)
    self.fields[</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;user_type</span><span style="color: #800000;"&gt;'</span>].choices = models.Usertype.objects.values_list(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span>)<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;按照第一种方式定义获取</span>
    self.fields[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;user_type1</span><span style="color: #800000;"&gt;'</span>].widget.choices=models.Usertype.objects.values_list(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span>)<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;按照第二种方式定义获取</span></pre>

views函数

request.method===myform() render(request,{:obj})

html模板

> > Title
method= enctype=>% csrf_token %

{{ obj.user }} {{ obj.user.errors.0 }}

{{ obj.pwd }} {{ obj.pwd.errors.0 }}

{{ obj.email }} {{ obj.email.errors.0 }}

{{ obj.user_type }}

{{ obj.user_type1 }}

value=/>

方式三:通过ModelChoiceField、ModelMultipleChoiceField(多选)字段进行自动获取最新数据,但是需要在model定义时候,自定义str方法,用于显示select标签选项。

model定义

django.forms django.forms django.forms django.forms cmdb =fields.CharField( widget=widgets.TextInput(attrs={:,: ===, to_field_name=, )

form定义

django.forms django.forms django.forms django.forms cmdb =fields.CharField( widget=widgets.TextInput(attrs={:, )

view函数

request.method===myform() render(request,{:obj})

html模板

> > Title
method= enctype=>% csrf_token %

{{ obj.user }} {{ obj.user.errors.0 }}

{{ obj.pwd }} {{ obj.pwd.errors.0 }}

{{ obj.email }} {{ obj.email.errors.0 }}

{{ obj.user_type }}

{{ obj.user_type1 }}

{{ obj.user_type2 }}

value=/>
在form验证的方法中,form验证提供了is_vaild方法进行验证,在这个方法中其实提供了许多的钩子让我们可以自定义验证。

Django1.11版本源码中验证is_vaild内部验证流程为:

obj.is_vaild-->self.errors-->self.full_clean-->self._clean_fields-->self._clean_form-->slef._post_clean,其中我们可以自己根据内置钩子进行验证。

1、self_clean_fields():字段正则表达式验证,里面会执行“clean_字段”方法,我们可以通过自定义该方法对字段进行单独验证。

示例:

form定义

==</span><span style="color: #0000ff;"&gt;def</span> clean_username(self): <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;验证username字段,名字必须为clean_username</span> c=models.user.objects.filter(name=self.cleaned_data[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;username</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]).count() </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; c: </span><span style="color: #0000ff;"&gt;return</span> self.cleaned_data[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;username</span><span style="color: #800000;"&gt;'</span>] <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;通过,将该字段数据返回</span> <span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;: </span><span style="color: #0000ff;"&gt;raise</span> ValidationError(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;用户名已经存在</span><span style="color: #800000;"&gt;'</span>,code=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;232</span><span style="color: #800000;"&gt;'</span>)<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;不通过则抛出异常</span> <span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; clean_email(self): </span><span style="color: #0000ff;"&gt;return</span> self.cleaned_data[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;email</span><span style="color: #800000;"&gt;'</span>]</pre>

?views函数

request.method=== render(request,,{ request.method=== obj1.is_valid(): redirect( render(request,{: obj1})

2、self._clean_form:对整体字段进行验证,执行该方法时候会执行self.clean()方法,所以通过定义self.clean()方法,可以对字段进行整体验证。

?tips:当使用_clean_form进行整体验证的时候错误信息放在了errors中的__all__或者NON_FIELD_ERRORS(from django.core.exceptions import NON_FIELD_ERRORS)字段里面。

===models.user.objects.filter(name=self.cleaned_data[=self.cleaned_data[ self.cleaned_data ValidationError()

3、slef._post_clean:还可以再一次进行验证,定义方法同self.clean()

==</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; _post_clean(self): </span><span style="color: #0000ff;"&gt;pass</span></pre>

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">六、自定义验证规则</td>
</tr></table>

方式一:

django.forms django.forms django.forms django.core.validators <span style="color: #0000ff;">class<span style="color: #000000;"> MyForm(Form):
user
=<span style="color: #000000;"> fields.CharField(
validators
=[RegexValidator(r<span style="color: #800000;">'
<span style="color: #800000;">^[0-9]+$
<span style="color: #800000;">'
,<span style="color: #800000;">'
<span style="color: #800000;">请输入数字
<span style="color: #800000;">'
),RegexValidator(r<span style="color: #800000;">'
<span style="color: #800000;">^159[0-9]+$
<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">数字必须以159开头<span style="color: #800000;">'<span style="color: #000000;">)],)

方式二:

django.forms django.forms django.forms django.core.exceptions <span style="color: #008000;">#<span style="color: #008000;"> 自定义验证规则
<span style="color: #0000ff;">def
<span style="color: #000000;"> mobile_validate(value):
mobile_re
= re.compile(r<span style="color: #800000;">'
<span style="color: #800000;">^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$
<span style="color: #800000;">'
<span style="color: #000000;">)
<span style="color: #0000ff;">if
<span style="color: #0000ff;">not
<span style="color: #000000;"> mobile_re.match(value):
<span style="color: #0000ff;">raise
ValidationError(<span style="color: #800000;">'
<span style="color: #800000;">手机号码格式错误<span style="color: #800000;">'<span style="color: #000000;">)

<span style="color: #0000ff;">class<span style="color: #000000;"> PublishForm(Form):

title </span>= fields.CharField(max_length=20<span style="color: #000000;"&gt;,min_length</span>=5<span style="color: #000000;"&gt;,error_messages</span>={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;required</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;标题不能为空</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;min_length</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;标题最少为5个字符</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;max_length</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;标题最多为20个字符</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;},widget</span>=widgets.TextInput(attrs={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;class</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;form-control</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;placeholder</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;标题5-20个字符</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;}))


</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 使用自定义验证规则</span>
phone = fields.CharField(validators=<span style="color: #000000;"&gt;[mobile_validate,error_messages</span>={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;required</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;手机不能为空</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;},</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;placeholder</span><span style="color: #800000;"&gt;'</span>: u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;手机号码</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;}))

email </span>= fields.EmailField(required=<span style="color: #000000;"&gt;False,error_messages</span>={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;required</span><span style="color: #800000;"&gt;'</span>: u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;邮箱不能为空</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;invalid</span><span style="color: #800000;"&gt;'</span>: u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;邮箱格式错误</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;},widget</span>=widgets.TextInput(attrs={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;class</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;form-control</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;placeholder</span><span style="color: #800000;"&gt;'</span>: u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;邮箱</span><span style="color: #800000;"&gt;'</span>}))</pre>

方式三:自定义方法

django django.forms django.forms django.core.exceptions django.core.validators </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; FInfo(forms.Form): username </span>= fields.CharField(max_length=5<span style="color: #000000;"&gt;,validators</span>=[RegexValidator(r<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;^[0-9]+$</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Enter a valid extension.</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;invalid</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)],) email </span>=<span style="color: #000000;"&gt; fields.EmailField() </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; clean_username(self): </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt; Form中字段中定义的格式匹配完之后,执行此方法进行验证 :return: </span><span style="color: #800000;"&gt;"""</span><span style="color: #000000;"&gt; value </span>= self.cleaned_data[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;username</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;] </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;666</span><span style="color: #800000;"&gt;"</span> <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; value: </span><span style="color: #0000ff;"&gt;raise</span> ValidationError(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;666已经被玩烂了...</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;invalid</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;return</span> value</pre>

方式四:同时生成多个标签进行验证

django.forms django.forms django.forms <span style="color: #0000ff;">from django.core.validators <span style="color: #0000ff;">import<span style="color: #000000;"> RegexValidator

<span style="color: #008000;">#<span style="color: #008000;">############# 自定义字段 ##############
<span style="color: #0000ff;">class<span style="color: #000000;"> PhoneField(fields.MultiValueField):
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,*<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> Define one message for all fields.
error_messages =<span style="color: #000000;"> {
<span style="color: #800000;">'<span style="color: #800000;">incomplete<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">Enter a country calling code and a phone number.<span style="color: #800000;">'<span style="color: #000000;">,}
<span style="color: #008000;">#<span style="color: #008000;"> Or define a different message for each field.
f =<span style="color: #000000;"> (
fields.CharField(
error_messages={<span style="color: #800000;">'<span style="color: #800000;">incomplete<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">Enter a country calling code.<span style="color: #800000;">'<span style="color: #000000;">},validators=<span style="color: #000000;">[
RegexValidator(r<span style="color: #800000;">'<span style="color: #800000;">^[0-9]+$<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Enter a valid country calling code.<span style="color: #800000;">'<span style="color: #000000;">),fields.CharField(
error_messages={<span style="color: #800000;">'<span style="color: #800000;">incomplete<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">Enter a phone number.<span style="color: #800000;">'<span style="color: #000000;">},<span style="color: #800000;">'<span style="color: #800000;">Enter a valid phone number.<span style="color: #800000;">'<span style="color: #000000;">)],fields.CharField(
validators=[RegexValidator(r<span style="color: #800000;">'<span style="color: #800000;">^[0-9]+$<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Enter a valid extension.<span style="color: #800000;">'<span style="color: #000000;">)],required=<span style="color: #000000;">False,)
super(PhoneField,self).<span style="color: #800080;">init(error_messages=error_messages,fields=f,require_all_fields=False,
<span style="color: #000000;">args,**<span style="color: #000000;">kwargs)

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; compress(self,data_list):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;
    当用户验证都通过后,该值返回给用户
    :param data_list:
    :return:
    </span><span style="color: #800000;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; data_list

<span style="color: #008000;">#<span style="color: #008000;">############# 自定义插件 ##############
<span style="color: #0000ff;">class<span style="color: #000000;"> SplitPhoneWidget(widgets.MultiWidget):
<span style="color: #0000ff;">def <span style="color: #800080;">init<span style="color: #000000;">(self):
ws =<span style="color: #000000;"> (
widgets.TextInput(),widgets.TextInput(),)
super(SplitPhoneWidget,self).<span style="color: #800080;">init<span style="color: #000000;">(ws)

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; decompress(self,value):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;
    处理初始值,当初始值initial不是列表时,调用该方法
    :param value:
    :return:
    </span><span style="color: #800000;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; value:
        </span><span style="color: #0000ff;"&gt;return</span> value.split(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    </span><span style="color: #0000ff;"&gt;return</span> [None,None,None]</pre>
1、使用django自带的序列化serializers函数,这个方法缺点是函数内部序列化为什么内容就返回什么内容,不能自定制。

django.core == serializers.serialize(,ret)

2、使用json自定义endocoder进行序列化操作

原理是:通过cls参数制定处理的类,每一次序列化操作都会调用该类中的default方法。

有些时候我们使用json.dumps方法序列化操作时候,并不能完全序列化,会报错,比如,在数据datetime日期时候,此时我们可以通过自定义序列化类来处理

datetime datetime ={:, JsonCustomEncoder(json.JSONEncoder): field.strftime( field.strftime(=json.dumps(a,cls=(b)

应用场景:ajax提交数据时候,Django进行数据验证返回给的错误数据时候使用,示例:

request.method===myform() render(request,{:obj}) request.method=== obj.is_valid(): (obj.clean()) (obj.cleaned_data)
        <span style="color: #0000ff;"&gt;return</span> redirect(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;/cmdb/fm/</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;######自定义序列化类进行错误序列化###</span>
        <span style="color: #0000ff;"&gt;from</span> django.core.exceptions <span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; ValidationError
        </span><span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; json
        </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; JsonCustomEncoder(json.JSONEncoder):
            </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; default(self,field):
                </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; isinstance(field,ValidationError):
                    </span><span style="color: #0000ff;"&gt;return</span> {<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;code</span><span style="color: #800000;"&gt;'</span>:field.code,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;message</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:field.messages}
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
                    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; json.JSONEncoder.default(self,field)
        ret</span>={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;status</span><span style="color: #800000;"&gt;'</span>:None,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;message</span><span style="color: #800000;"&gt;'</span>:None,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;code</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;:None}
        ret[</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;error</span><span style="color: #800000;"&gt;'</span>]=<span style="color: #000000;"&gt;obj.errors.as_data()
        res</span>=json.dumps(ret,cls=<span style="color: #000000;"&gt;JsonCustomEncoder)
        </span><span style="color: #0000ff;"&gt;return</span> HttpResponse(res)    </pre>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读