Django表单类forms之实例属性

前言

这几年一直在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'})
        }

除此之外,还可以指定labelshelp_textserror_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':'你的名字太长了'
            }
        }

Guess you like

Origin blog.csdn.net/HeroicLee/article/details/121382683