from django import forms
class LoginForm(forms.Form):
username=forms.CharField(label="用户名",min_length=6,max_length=12)
password=forms.CharField(label="用户密码",min_length=8)
在实际的开发工作中使用类的方式是非常方便,可以帮助开发者减少编写重复的代码的工作,而且代码也显得更为整洁,所以这种方式也是我们推荐使用的。
In [1]: from django import forms
...: class LoginForm(forms.Form):
...: title=forms.CharField(label="书名")
In [2]: f= LoginForm()#未绑定数据
In [3]: f.is_bound #检查是否绑定数据
Out[3]: False
In [4]: f= LoginForm({"title":"jango"})#字典传递数据
In [5]: f.is_bound
Out[15]: True #已经绑定数据
在此字典中,键是字段名称即 title,该字段名称与 LoginForm 类中的属性相对应。这些值是您要验证的数据。这些数据通常是字符串,但是有时也要看具体的 Field 字段类型,因为此时数据类型会有所不同。在上述代码中,我们使用 is_bound() 来区分表单是否绑定了数据。若返回 True 则说明绑定了数据,反之则未绑定。如果你有一个绑定的 Form 实例,但是你想更改数据或者你想给一个未绑定的 Form 表单绑定一些数据,此时你需要创建一个新 Form 实例。因为 Form 实例一旦创建,它的数据将不可变。
那么各位小伙伴可以试一试,如果传递的是个空字典又会怎么样呢?猜一猜它的返回值是 True 还是 False 呢?提示:传递空字典会创建具有空数据的绑定形式。
from django import forms
class ContactForm(forms.Form):
def clean(self):
cleaned_data = super().clean() #继承clean()方法
username= cleaned_data.get("username") #获取值
password = cleaned_data.get("password")
if username and password: #两者必须同时满足才可以
if "Mrcao" not in username: #验证用户名字
raise forms.ValidationError(
"USE is error or password
is error"
)
In [1]: from django import forms
...: class LoginForm(forms.Form):
...: title=forms.CharField(label="书名")
...:
In [2]: f=LoginForm({'title':'Django'})
In [3]: f.is_valid()
Out[3]: True
""的时候,则返回值是 False,因为 CharField 的 required 参数规定了此字段是必填项。所以这里的验证输入值是无效值。示例如下所示:
In [1]: from django import forms
...: class LoginForm(forms.Form):
...: title=forms.CharField(label="书名")
In [2]: f=LoginForm({'title':'Django'})
In [3]: f=LoginForm({'title':''})
In [4]: f.is_valid()
Out[4]: False
In [10]: f.errors.as_json()
Out[10]: '{"title": [{"message": "\\u8fd9\\u4e2a\\u5b57\\u6bb5\\u662f\\u5fc5\\u586b\\u9879\\u3002", "code": "required"}]}'
In [11]: f.errors.as_data()#返回一个字典,它将字段映射到原始的ValidationError实例
Out[11]: {'title': [ValidationError(['这个字段是必填项。'])]}
In [12]: f.has_error(field="title",code="required")
Out[12]: True
In [19]: f=LoginForm({"title":"Python"},initial={'title':'Django'})
In [20]: f.has_changed()
Out[20]: True
class LoginForm(forms.Form):
title=forms.CharField(label="书名")
user=forms.CharField(label="用户名")
f=LoginForm({"title":"c++","user":"yanchangsheng"},initial={"title":"Django","user":"caoxuesong"})
if f.has_changed():
print("-".join(f.changed_data))
输出结果是:title-user
f.fields.values() odict_values([<django.forms.fields.CharField object at 0x087404F0>, <django.forms.fields.CharField object at 0x08740C30>]) f.fields['title'] <django.forms.fields.CharField at 0x87404f0>
In [1]: f.cleaned_data
Out[1]: {'title': 'c++', 'user': 'yanchangsheng'}
如上所示通过 cleaned_data 属性实现字段值数据的访问,不过在正常的逻辑中,我们先会使用 is_valid() 方法对输入数据的合法性进行验证,然后再使用该属性得到干净的数据,若验证时存在不合法的数据,cleaned_data 方法将会自动清洗掉不它们,只显示合法的数据。
In [2]: f=LoginForm() In [3]: print(f) <tr><th><label for="id_title">书名:</label></th><td><input type="text" name="title" required id="id_title"></td></tr> <tr><th><label for="id_user">用户名:</label></th><td><input type="text" name="user" required id="id_user"></td></tr>不过在输出 HTML 时有以下注意事项:
In [1]: f.as_p() Out[1]: '<p><label for="id_title">书名:</label> <input type="text" name="title" required id="id_title"></p>\n<p><label for="id_user">用户名:</label> <input type="text" name="user" required id="id_user"></p>' In [2]: f.as_ul() Out[2]: '<li><label for="id_title">书名:</label> <input type="text" name="title" required id="id_title"></li>\n<li><label for="id_user">用户名:</label> <input type="text" name="user" required id="id_user"></li>'
In [6]: class LoginForm(forms.Form):
...: error_css_class="error"
...: required_css_class="required"
...: title=forms.CharField(label="书名")
...: user=forms.CharField(label="用户名")
...: f=LoginForm({"title":"c++","user":"yanchangsheng"},initial={"title":"Django","user":"caoxuesong"})
In [5]: print(f)
#按as_table()输出表格添加 required属性
<tr class="required"><th><label class="required" for="id_title">书名:</label></th><td><input type="text" name="title" value="c++" required id="id_title"></td></tr>
<tr class="required"><th><label class="required" for="id_user">用户名:</label></th><td><input type="text" name="user" value="yanchangsheng" required id="id_user"></td></tr>
#通过label_tag(attrs={})设置属性名
In [8]: f['title'].label_tag(attrs={'class': 'bar'})
Out[8]: '<label class="bar required" for="id_title">书名:</label>'
本节我们对 Django Form 表单中的常用 API 做了讲解,内容也许有点对,不过结合应用实例理解起来应该还算简单,如果你意犹未尽想继续深入学习 Form 表单的 API ,那么我建议你参考官方文档《Form API》。在下一节《Django Form表单完整使用流程》我们将使用这几节中学到的知识,完成一个完整的 Form 表单使用流程。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有