前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
后台中表单实例属性
表单类的实例,只有两种,一种是绑定了数据的,一种是未绑定的。都可以渲染成为
html
Form.is_valid()
对于绑定了数据的表单,进行验证并返回一个数据是否合法的布尔值
并在所有数据有效时将数据放入
cleaned_data
中
Form.is_bound()
区分绑定表单和未绑定表单,当表单类绑定数据时,返回
True
Form.errors
当验证发生错误时的错误信息的字典,字典key
值为字段名称,value
为报错信息列表,可能有多个报错
表单的数据将会在调用
is_valid
时或访问errors
属性时验证并且验证过程只会调用一次,不论访问
errors
和调用is_valid
多少次
class TestForm(forms.Form):
name = forms.CharField(max_length=5,)
email = forms.EmailField(required=True)
def clean_name(self):
cleaned_data = super(TestForm,self).clean()
if self.cleaned_data.get('name') == '小红':
raise forms.ValidationError("不允许小红")
return cleaned_data
>>> f = forms.TestForm({'name':'小红','emali':'123'})
>>> a.errors
{'name': ['不允许小红'], 'email': ['This field is required.']}
Form.errors.as_data
返回报错信息的字典,映射字段报错信息到一个ValidationError实例
>>> f.errors.as_data()
{
'name': [ValidationError(['不允许小红'])],
'email': [ValidationError(['This field is required.'])]
}
Form.errors.as_json(escape_html=False)
以
json
格式返回错误信息
>>> a.errors.as_json()
'{
"name": [{"message": "\\u4e0d\\u5141\\u8bb8\\u5c0f\\u7ea2", "code": ""}],
"email": [{"message": "This field is required.", "code": "required"}]
}'
Form.initial
声明当前表单类的默认数据,参数为一个字典数据类型
key
对应需要填充默认数据的表单字段,value
值为实际数据
class TestForm(forms.Form):
name = forms.CharField(max_length=5,initial='Jack',)
>>> f = TestForm(initial={'name':'Bob'})
>>> print(f)
<tr><th>
<label for="id_name">Name:</label></th><td>
<input id="id_name" maxlength="5"
name="name" type="text" value="Bob" /></td></tr>
<tr><th>
Form.has_changed()
检查表单当前的数据是否与默认值不同
>>> f = TestForm(data={'name':'Jack'},initial={'name':'Bob'})
>>> f.has_changed()
True
Form.cleaned_data
在对绑定数据的表单实例进行is_valid
验证之后,如果数据无误,那么返回的数据将保存在cleaned_data
中
如果有部分数据没有经过验证,那么cleaned_data
中也会保留合法的字段
并且,
在cleaned_data
属性中获取到的数据,只包含表单类中含有的字段
class TestForm(forms.Form):
name = forms.CharField(max_length=5,)
email = forms.EmailField(required=True)
active = forms.BooleanField()
>>> data = {
... 'name':'Jack',
... 'email':'111',
... 'active':True,
... }
>>>
>>> f = TestForm(data=data)
>>> f.is_valid()
False
>>> f.cleaned_data
{ 'name':'Jack', 'active': True}
Form.as_p()
将表单渲染为一系列的
<p>
标签,每个标签内含一个字段
class TestFrom(forms.Form):
name = forms.CharField(max_length=5)
>>> f = TestForm()
>>> print(f.as_p())
<p><label for="id_name">Name:</label> <input id="id_name" maxlength="5" name="name" type="text" /></p>
Form.as_ul()
渲染表单为一系列的
<li>
标签,并且不包含<ul>
标签,可以自行指定<ul>
的HTML
属性
>>> print(f.as_ul())
<li><label for="id_name">Name:</label> <input id="id_name" maxlength="5" name="name" type="text" /></li>
Form.as_table()
渲染表单为
<tr><th>
标签
>>> print(f.as_table())
<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" maxlength="5" name="name" type="text" /></td></tr>
配置表单元素的HTML id
值与默认自带的label
标签
通过表单类进行渲染时,默认会包含以下属性
- 表单元素的
HTML id
属性 - 辅助的
label
标签
有些时候,想要设置自定义HTML id值或者取消label标签,可以使用如下内置函数
Form.auto_id=True
修改对应渲染表单属性
当
auto_id
值为False
时,表单类的渲染将不会包含<label>
以及id
属性
>>> f = TestForm(auto_id=False)
>>> print(f)
<tr><th>Name:</th><td><input maxlength="5" name="name" type="text" /></td></tr>
模板中表单实例属性
模板页面接收到的
form
表单实例支持循环遍历访问
{% for field in form %}
{{ field }}
{% endfor %}
其中
for
迭代访问之后的每一个表单字段又支持如下操作
{{ field.label }}
:字段的label,例如Email address。{{ field.label_tag }}
:包含在HTML{{ field.id_for_label }}
:这个字段的ID值。{{ field.value }}
:字段的值{{ field.html_name }}
:该字段的标签中name属性使用的值。{{ field.help_text }}
:该字段的帮助文档。{{ field.errors }}
:字段的验证错误信息,字段标签会在- 属性中。
{{ field.is_hidden }}
:如果该字段为隐藏字段,返回True。反之返回False。{{ field.field }}
:获取当前字段实例,可以用该属性来访问字段实例的属性
{{ field.field.max_length }}
与模型类关联的表单
除了以上我们自定义表单类来进行表单的初始化
django
还提供了另外一种表单类的创建方法,可以通过与模型关联来构建表单
这种办法可以更加省时省力,直接使用模型类中已经定义好的字段来进行表单字段的生成
class TestTable(modes.Model):
name = models.CharField(max_length=10)
class TestTableForm(forms.ModelForm):
class Meta:
model = TestTable
fields = ['name']
生成的表单实例将具备模型类中的字段,表单生成的字段顺序也与模型类中的定义顺序相同
fields
属性用来显示的设置所有需要在表单中处理的字段
也可以直接为该字段设置fields = '__all__'
来使用所有模型类中的字段作为未来的表单字段
- 注意:
- 如果模型类中字段定义了
blank=True
,那么对应关联的表单类中字段会默认具有require=False
的属性 - 模型类中字段的
verbose_name
属性对应关联表单类字段的Label属性 - 如果模型类字段中设置了
choices
值,那么对应关联表单字段的widget
将会设置为select
- 如果模型类中字段定义了
当然,除了根据关联模型类来创建表单类,还可以在关联表单类中选择性的覆盖某些字段的设置
比如使用表单类Meta
元类中的widgets
属性可以以字典形式设置对应字段的控件
class TestTableForm(forms.ModelForm):
name = forms.URLField()
class Meta:
model = TestTable
fields = ['name']
widgets = {
'name':forms.Textarea(attrs={'class':'green'})
}
除此之外,还可以指定labels
、help_texts
和error_messages
等信息
class TestTableForm(forms.ModelForm):
name = forms.URLField()
class Meta:
model = TestTable
fields = ['name']
labels = {
'name':'您的名字'
}
help_texts = {
'name':'请输入您的名字'
}
error_messages = {
'name':{
'required':'你必须填写这个名字',
'max_length':'你的名字太长了'
}
}