慕课网-Django入门到进阶-更适合Python小白的系统课程-第5章Django中的Form表单的使用-5-2form表单验证与前端显示方法
第5章 Django 中的 Form 表单的使用
5-2 Form 表单验证与前端显示方法
处理方法
1.表单只处理 get 和 post
2.在 get 中,实例化表单对象,将 form 表单渲染到模板
3.在 post 中,实例化表单对象,并将 request.POST 对象传给表单
4.Get -> form = Auth()
5.Post -> form = Auth(request.POST),通过 is_valid() 对数据进行验证,当验证通过后,可以通过 cleaned_data[subject] 获取输入的值
表单在前端自动展示的方法
方法 | 介绍 |
{{form}} | 直接使用 |
{{form.as_table}} | 他会在你的 table 标签中展示 |
{{form.as_p}} | 他会生成在 p 标签内 |
{{form.as_ul}} | 他会在你的 ul 中以 li 形式展示 |
代码演示
<p><label for="id_subject">Subject:</label><input type="text" name="subject" maxlength="100" required /></p> <p><label for="id_message">Message:</label><textarea name="message" id="id_message" required /></textarea></p> <p><label for="id_sender">Sender:</label><input type="email" name="sender" id="sender" required /></p> <p><label for="id_cc_myself">Cc myself:</label><input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
表单在前端手动展示的方法
方法 | 介绍 |
{{form.subject.errors}} | 展示项目验证失败时候返回的错误,如名称的 s 一般,他是一个列表,可用 for 循环 |
{{form.subject.id_for_label}} | 展示项目 label 的名称(该标签需要手动书写 label 标签) |
{{form.subject.label_tag}} | 该字段的 label 封装在相应的 HTML <label> 标签中 |
{{form.subject}} | 正式展示输入该字段的位置 |
{{form.subject.value}} | 展示默认的初始值 |
{{form.subject.is_hidden}} | 是否是隐藏字段 true or false |
代码演示
<div class="fieldWrapper"> {{form.subject.errors}} <label for="{{form.subject.id_for_label}}">Email subject:</label> {{form.subject}} </div>
For 循环展示错误
{% if form.subject.errors %} <ol> {% for error in form.subject.errors %} <li><strong>{{ error|escape }}</strong></li> {% endfor %} </ol> {% endif %}
内置表单字段类型介绍
类型名称 | 介绍 |
CharField | 文本类型 |
EmailField | 验证是否是有效的 email 格式 |
URLField | 验证是否是有效的 url 地址 |
GenericIPAddressField | 验证 ip 类型 |
TimeField | 验证是否为 datetime.time 或指定格式的字符串 |
DateField | 验证日期格式,通过参数 input_formats 定义日期格式 |
ChoiceField | 选择类型,通过参数 choices 设置内容 |
BooleanField | 复选框,当 required=True 时默认勾选 |
IntegerField | 验证值是否是整数 |
FloatField | 验证值是否是浮点类型 |
FileField | 文件上传,allow_empty_file 设置是否可为空 |
ImageField | 验证上传的文件是否是图片 |
代码演示
# forms 中导入 fields 中的对象 from django import forms # 字段来源于此 form django.forms import fields
内置表单字段属性介绍
属性名称 | 介绍 |
required | 是否必填,默认为 True |
widget | 设置 input 的 type 样式,更多类型 fields.widget |
label | 设置标签名 |
initial | 设置初始值 |
localize | 是否支持时间本地化,时区不同时显示响应的时间 |
disabled | 是否可编辑 |
error_messages | 设置错误信息,字典类型,对属性错误进行说明 |
max_length | 设置最大长度 |
min_length | 设置最小长度 |
validators | 自定义验证规则,列表,内容是自定义的验证函数 |
代码演示
fields.CharField(max_length=50, required=True, widget=forms.widget.PasswordInput, error_messages={'required':'内容不能为空'}, label='密码')
实例
1.在项目 form 下目录 templates,修改文件 regist.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>regist</title> </head> <body> <form action="{% url 'regist' %}" method="post"> {% csrf_token %} {% for item in form %} <label for="{{item.id_for_label}}">{{item.label}}</label> {{item}} <p>{{item.errors.as_text}}</p> {% endfor %} <span>{{form.non_field_errors}}</span> <!--<label>用户名</label><input type="text" name="username" placeholder="用户名" /><br/>--> <!--<label>密码</label><input type="password" name="password" placeholder="密码" /><br/>--> <input type="submit" value="提交" /> </form> </body> </html>
2.在项目 form 下目录 app,修改文件 forms.py
from django import forms from django.forms import fields class Auth(forms.Form): username = fields.CharField(max_length=18, required=True, label="username") password = fields.CharField(widget=forms.PasswordInput, label="password")
3.测试
4.在项目 form 下目录 templates,修改文件 regist.html,添加了 div
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>regist</title> </head> <body> <form action="{% url 'regist' %}" method="post"> {% csrf_token %} {% for item in form %} <div> <label for="{{item.id_for_label}}">{{item.label}}</label> {{item}} <p>{{item.errors.as_text}}</p> </div> {% endfor %} <span>{{form.non_field_errors}}</span> <!--<label>用户名</label><input type="text" name="username" placeholder="用户名" /><br/>--> <!--<label>密码</label><input type="password" name="password" placeholder="密码" /><br/>--> <input type="submit" value="提交" /> </form> </body> </html>
5.在项目 form 下目录 app,修改文件 forms.py
from django import forms from django.forms import fields class Auth(forms.Form): username = fields.CharField( max_length=18, min_length=3, required=True, label="用户名", widget=forms.TextInput(attrs={'placeholder':'最大不能超过18字符'}), # error_messages={'max_length':'最大不能超过18字符!'} ) password = fields.CharField( widget=forms.PasswordInput(attrs={'placeholder':'请输入密码'}), label="密码", required=True, min_length=10, error_messages={'min_length':'最小不能低于10个字符'} )
6.测试
7.在项目 form 下目录 app,修改文件 forms.py,全体验证
from django import forms from django.forms import fields class Auth(forms.Form): username = fields.CharField( max_length=18, min_length=3, required=True, label="用户名", widget=forms.TextInput(attrs={'placeholder':'最大不能超过18字符'}), error_messages={'max_length':'最大不能超过18字符!'} ) password = fields.CharField( widget=forms.PasswordInput(attrs={'placeholder':'请输入密码'}), label="密码", required=True, min_length=10, error_messages={'min_length':'最小不能低于10个字符'} ) def clean(self): username = self.cleaned_data.get('username', '') password = self.cleaned_data.get('password', '') if not username: raise forms.ValidationError('用户名不可以为空!') if len(username) > 10: raise forms.ValidationError('用户名最大不能超过10') if not password: raise forms.ValidationError('密码不可以为空!')
8.在项目 form 下目录 app,修改文件 views.py
from django.shortcuts import render, redirect from django.views.generic import View from .forms import Auth class Regist(View): TEMPLATE = 'regist.html' def get(self, request): form = Auth() return render(request, self.TEMPLATE, {'form': form}) def post(self, request): # username = request.POST.get('username') # password = request.POST.get('password') form = Auth(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') print('username:', username) print('password', password) else: return render(request, self.TEMPLATE, {'form':form}) return redirect('/regist')
9.在项目 form 下目录 templates,修改文件 regist.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>regist</title> </head> <body> <form action="{% url 'regist' %}" method="post"> {% csrf_token %} {% for item in form %} <div> <label for="{{item.id_for_label}}">{{item.label}}</label> {{item}} <p>{{item.errors.as_text}}</p> </div> {% endfor %} <span>{{form.non_field_errors.as_text}}</span><br/> <!--<label>用户名</label><input type="text" name="username" placeholder="用户名" /><br/>--> <!--<label>密码</label><input type="password" name="password" placeholder="密码" /><br/>--> <input type="submit" value="提交" /> </form> </body> </html>
10.测试
11.在项目 form 下目录 app,修改文件 forms.py,单独验证
from django import forms from django.forms import fields class Auth(forms.Form): username = fields.CharField( max_length=18, min_length=3, required=True, label="用户名", widget=forms.TextInput(attrs={'placeholder':'最大不能超过18字符'}), error_messages={'max_length':'最大不能超过18字符!'} ) password = fields.CharField( widget=forms.PasswordInput(attrs={'placeholder':'请输入密码'}), label="密码", required=True, min_length=10, error_messages={'min_length':'最小不能低于10个字符'} ) def clean(self): password = self.cleaned_data.get('password', '') if not password: raise forms.ValidationError('密码不可以为空!') def clean_username(self): username = self.cleaned_data.get('username', '') if len(username) > 18: raise forms.ValidationError('用户名最大不能超过18') return username
12.测试
13.在项目 form 下目录 app,修改文件 views.py,使用 reverse 反转 URL
from django.shortcuts import render, redirect, reverse from django.views.generic import View from .forms import Auth class Regist(View): TEMPLATE = 'regist.html' def get(self, request): form = Auth() return render(request, self.TEMPLATE, {'form': form}) def post(self, request): # username = request.POST.get('username') # password = request.POST.get('password') form = Auth(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') print('username:', username) print('password', password) else: return render(request, self.TEMPLATE, {'form':form}) return redirect(reverse('regist'))
posted on 2020-02-06 09:10 herisson_pan 阅读(4) 评论(0) 收藏 举报