Django Form
一稚杨
2018-07-29
基本原理 修改label提示内容 利用widget来设置密文输入 利用required来设置非必须参数 其实Django form的原理和Django模型的原理类似,都是通过创建类的方法去不断的实例化对象, 从而得到同一类型但内容不同的form表单所以首先需要创建一个form表单类 创建Form表单模型类 from django import forms class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField() class LoginForm(forms.Form): username = forms.CharField(label='用户名') password = forms.CharField(label='密码') password = forms.CharField(label='密码', widget=forms.PasswordInput) 使用Form表单 username = forms.CharField(label='用户名', required=False) required默认为True(必须参数) 使用方法很简单,只需要在相应的试图函数中实例化一个Form对象,再通过参数传递给对应模板文件即可 视图函数 # Django form表单测试 def testform(request): # 实例化一个Form表单对象 login_form = LoginForm() context = {} # 传递给模板文件 context['login_form'] = login_form return render(request, 'test.html', context) 模板文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <form method="post"> {% csrf_token %} {{ login_form }} <input type="submit" value="登录"> </form> </body> </html> 使用is_valid来判断提交数据是否有效 if request.method == 'POST': login_form = LoginForm(request.POST) # 判断接受的数据是否有效,有效则为True,否则为FALSE(比如输入的是一串空格) if login_form.is_valid(): pass else: pass return HttpResponse('success POST') 通过login_form.cleaned_data来得到相应的参数 if login_form.is_valid(): username = login_form.cleaned_data['username'] password = login_form.cleaned_data['password'] print(username, password) 利用login_form.add_error(判断错误的字段, 错误提示信息)来完成错误信息的提示 if login_form.is_valid(): username = login_form.cleaned_data['username'] password = login_form.cleaned_data['password'] # 用户登录 user = authenticate(request, username=username, password=password) # 判断user是否为none,如果为none则代表用户信息有错 if user is not None: auth.login(request, user) else: # 登录信息有错误,则在表单上增加错误提示信息 login_form.add_error(None, '用户名或密码错误!') context={} # 传递给模板文件 context['login_form']=login_form return render(request, 'test.html', context) 其中设置判断错误的字段为none代表捕获所有字段的错误信息 定制clean方法 定义clean方法,该方法是Django Form中特定的方法,只要一执行is_valid这个数据检查方法,就会执行clean这个方法 所以用户验证的内容可以放在这个方法里面,验证时只需要验证is_valid通过,则表示用户信息没有问题,可以直接登录 class LoginForm(forms.Form): username = forms.CharField(label='用户名') password = forms.CharField(label='密码', widget=forms.PasswordInput) # 定义clean方法,该方法是Django Form中特定的方法,只要一执行is_valid这个数据检查方法,就会执行clean这个方法 # 所以用户验证的内容可以放在这个方法里面,验证时只需要验证is_valid通过,则表示用户信息没有问题,可以直接登录 def clean(self): username = self.cleaned_data['username'] password = self.cleaned_data['password'] user = auth.authenticate(username=username, password=password) # 判断用户信息 if user is None: # 用户信息错误,返回错误提示信息 raise forms.ValidationError('用户名或密码错误!') else: # 用户信息正确 self.cleaned_data['user'] = user return self.cleaned_data 通过这样,验证数据时只需要通过了is_valid方法的验证,则说明数据没有问题,可以直接使用user登录 login_form的本质 可以通过打印login_form的方式得到login_form的本质就是一个关于form表单的列表 <tr><td colspan="2"><ul class="errorlist nonfield"><li>用户名或密码错误!</li></ul></td></tr> <tr><th><label for="id_username">用户名:</label></th><td><input type="text" name="username" value="hwy" class="form-control" required id="id_username" /></td></tr> <tr><th><label for="id_password">密码:</label></th><td><input type="password" name="password" class="form-control" required id="id_password" /></td></tr> 所以可以在模板文件中通过遍历这个列表来显示其中的内容 自定义字段的前端样式 为了美化页面,一般需要对Django Form表单的样式进行自定义,这是就需要用到attrs参数 # 其中attrs为指定对应字段的前端样式,相当于html表单中的class指定样式 username = forms.CharField(label='用户名', widget=forms.TextInput(attrs={'class': 'form-control'})) password = forms.CharField(label='密码', widget=forms.PasswordInput(attrs={'class': 'form-control'})) 通过样式的自定义,实际的表单代码为 <tr><th><label for="id_username">用户名:</label></th><td><input type="text" name="username" value="hwy" class="form-control" required id="id_username" /></td></tr> <tr><th><label for="id_password">密码:</label></th><td><input type="password" name="password" class="form-control" required id="id_password" /></td></tr> 在前端页面显示错误信息 <div class="containter" style="margin-top:10%; width:100%"> <div class="row" style="width:80%; margin-left:10%"> <div class="col-xs-4 col-xs-offset-4" style="width:100%; margin-left:0px;"> <div class="panel panel-default" style="width: 300px; margin: 0 auto"> <div class="panel-heading"> <h3 class="panel-title">登录</h3> </div> <div class="panel-body"> <form method="post"> {% csrf_token %} {% for filed in login_form %} {# 去掉冒号 #} <label>{{ filed.label }}</label> {{ filed }} {# 显示对应字段的错误信息 #} <p class="text-danger">{{ filed.errors.as_text }}</p> {% endfor %} {# 在最底部显示错误信息 #} <span class="pull-left text-danger">{{ login_form.non_field_errors }}</span> <input type="submit" class="btn btn-primary pull-right" value="登录"> </form> </div> </div> </div> </div> </div> 最终样式 Django Form表单的使用