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号
广州京杭网络科技有限公司 版权所有