一 form组件的存在,简化了form的验证等操作。
二 导入form
from django import forms
三 最简单的例子
前端代码
<form action="/form_login/" method="post"> <p>姓名:{{ formlogin.username }}</p> <p>密码:{{ formlogin.password }}</p> <p><input type="submit" value="提交"></p> </form>
视图代码
class FormLogin(forms.Form): username=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!', 'max_length': '最大长度为10!'}) password=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!', 'max_length': '最大长度为10!'}) #error_message={},自定义错误信息。如果没有这个参数,默认错误信息是英文。 def form_login(request): if request.method=='POST': formlogin=FormLogin(request.POST) #绑定数据的表单实例 formlogin=FormLogin() #未绑定数据的表单实例 print('formlogin',formlogin,type(formlogin)) return render(request,'form_login.html',{'formlogin':formlogin})
输出:
formlogin <tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" maxlength="10" minlength="5" required id="id_username" /></td></tr> <tr><th><label for="id_password">Password:</label></th><td><input type="text" name="password" maxlength="10" minlength="5" required id="id_password" /></td></tr> <class 'app01.views.FormLogin'>
Django给每个input框的id默认取值为id_+FormLogin的字段
四 form组件微进阶
准备知识
登录成功是cleaned_data 是个什么东西
def form_login(request): if request.method=='POST': formlogin=FormLogin(request.POST) if formlogin.is_valid(): print(formlogin.cleaned_data,type(formlogin.cleaned_data)) return HttpResponse('ok')
输出:
{'username': 'aaaaaaaaa', 'password': 'aaaaaa'} <class 'dict'>
cleaned_data是一个字典。
判断成功:,username=cleaned_data.get('username'),password=cleaned_data.get('password')。
User.objects.filter(username='username',password='password'),判断用户名,密码是否正确。
更为高端更为屌的写法是:User.objects.filter(**cleaned_data)。注意,input的name值须与与auth.user表的相关联的字段名保持一致。
判断失败:这才是我们更需要关心的重点。
登录不成功时,errors是个什么东西
def form_login(request): if request.method=='POST': formlogin=FormLogin(request.POST) if formlogin.is_valid(): print(formlogin.cleaned_data,type(formlogin.cleaned_data)) return redirect('/index/') else: print(formlogin.errors,type(formlogin.errors)) #formlogin.errers格式是ErrorDict return HttpResponse('ok')
输出:
<ul class="errorlist"><li>username<ul class="errorlist"><li>最小长度为5!</li></ul></li><li>password<ul class="errorlist"><li>最小长度为5!</li></ul></li></ul> <class 'django.forms.utils.ErrorDict'>
formlogin.errors通过get方法取其错误提示信息。
问题来了,用户输入的可能不符合规定的条件有好几个,假如由name='xxx'定位的input有三处错误,那么errors里对应对'xxx'后面跟的错误也是三个。需要一次性给用户提示出来吗?
实际上并不需要如此。取其索引值为0,一次一个的提示用户的错误信息即可。 在前面页面中,渲染时便可实现。通过点号 . 。句点符可以调用属性,key value值,索引。
核心代码
前端
<form action="/form_login/" method="post"> {% csrf_token %} <p>姓名:{{ formlogin.username }} <span>{{ error_all.username.0 }}</span></p> <p>密码:{{ formlogin.password }} <span>{{ error_all.password.0 }}</span></p> <p><input type="submit" value="提交"></p> </form>
视图函数
def form_login(request): if request.method=='POST': formlogin=FormLogin(request.POST) if formlogin.is_valid(): print(formlogin.cleaned_data,type(formlogin.cleaned_data)) return redirect('/index/') else: error_all=formlogin.errors return render(request,'form_login.html',{'error_all':error_all,'formlogin':formlogin})
五 form组件的进阶
1 widgets
官方文档地址:http://python.usyiyi.cn/documents/django_182/ref/forms/widgets.html
Widget 是Django 对HTML 输入元素的表示。Widget 负责渲染HTML和提取GET/POST 字典中的数据。
小贴士
不要将Widget 与表单字段搞混淆。表单字段负责验证输入并直接在模板中使用。Widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据。但是,Widget 需要赋值给表单字段。
from django.forms import widgets
attrs参数
在真正得网页中,你可能不想让每个Widget 看上去都一样。可以指定‘type’ 属性使用的是新式的HTML5 输入类型。在创建Widget 时使用Widget.attrs 参数可以实现。
password=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!', 'max_length': '最大长度为10!'},widget=widgets.Textarea(attrs={'style': 'color:red'}))
其他形式:
widget=widgets.TextInput(attrs={'class':'form-control'})
widget=widgets.PasswordInput(attrs={'class':'form-control'})
2 表单字段 很重要!!
官方文档地址:http://python.usyiyi.cn/documents/django_182/ref/forms/fields.html
class Field(**kwargs)¶
创建一个表单类时,最重要的部分是定义表单的字段。每个字段都可以有自定义的验证逻辑,以及一些其它的钩子。
- Field.clean(value)¶
虽然字段类主要使用在表单类中,但你也可以直接实例化它们来使用,以便更好地了解它们是如何工作的。每个字段实例都有一个clean()方法, 它接受一个参数,然后返回“清洁的”数据或者抛出一个django.forms.ValidationError异常:
>>> from django import forms >>> f = forms.EmailField() >>> f.clean('foo@example.com') 'foo@example.com' >>> f.clean('invalid email address') Traceback (most recent call last): ... ValidationError: ['Enter a valid email address.']