django基础篇05-Form验证组件
Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
- 初始化页面显示内容
基本简单的操作:
from django import forms class FM(forms.Form): # 根据form表单中的name来做 username = fields.CharField( error_messages={'required':'用户名不能为空'}, ) pwd = fields.CharField( error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'}, min_length=6, max_length=12, ) email = fields.EmailField( error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'} )
def index(request): if request.method == 'GET': # 解决错误提示后内容清空的问题 obj = FM() return render(request,'form_index.html',{'obj': obj}) elif request.method == 'POST': # 获取用户所有数据 # 每条数据请求验证 # 成功:获取用户提交的数据 # 失败:显示错误信息 obj = FM(request.POST) # 验证是否合法 ret = obj.is_valid() if ret: print('obj.clean****',obj.clean()) print('obj.clead_data*****',obj.cleaned_data) else: print('obj.errors****',obj.errors) print('obj.errors.as_json()*****',obj.errors.as_json()) print('obj****',obj) # from django.forms.utils import ErrorDict # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值 print(type(obj.errors)) return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>form验证组件</title> <style> .usernameTF{ background-color: coral; color: aqua; } </style> </head> <body> <form action="/form_app/index" method="post"> {% csrf_token %} <p><input type='text' name='username'/> {{ error_msg.username.0 }}</p> <p><input type='text' name='pwd'/> {{ error_msg.pwd.0 }}</p> <p><input type='text' name='email'/> {{ error_msg.email.0 }}</p> <p><input type="submit" value="提交"></p> </form> </body> </html>
进阶操作:
主要涉及widget的使用、初始化默认值,以及记录上次填写的值
from django import forms from django.forms import widgets from django.forms import fields class FM(forms.Form): # 根据form表单中的name来做 username = fields.CharField( error_messages={'required':'用户名不能为空'}, widget=widgets.Textarea(attrs={'class':'usernameTF'}) ) pwd = fields.CharField( error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'}, min_length=6, max_length=12, widget=widgets.PasswordInput ) email = fields.EmailField(error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>form验证组件</title> <style> .usernameTF{ background-color: coral; color: aqua; } </style> </head> <body> <form action="/form_app/index" method="post"> {% csrf_token %} <p>{{ obj.username }} {{ error_msg.username.0 }}</p> <p>{{ obj.pwd }} {{ error_msg.pwd.0 }}</p> <p>{{ obj.email }} {{ error_msg.email.0 }}</p> <p>{{ obj.user }}</p> <p><input type="submit" value="提交"></p> </form> </body> </html>
def index(request): if request.method == 'GET': # 加载默认值 initial_dic = { 'username': 'root', 'pwd': '12345678', 'email': '953995648@qq.com', 'user': True } obj = FM(initial_dic) return render(request,'form_index.html',{'obj': obj}) elif request.method == 'POST': # 获取用户所有数据 # 每条数据请求验证 # 成功:获取用户提交的数据 # 失败:显示错误信息 obj = FM(request.POST) # 验证是否合法 ret = obj.is_valid() if ret: print('obj.clean****',obj.clean()) print('obj.clead_data*****',obj.cleaned_data) else: print('obj.errors****',obj.errors) print('obj.errors.as_json()*****',obj.errors.as_json()) print('obj****',obj) # from django.forms.utils import ErrorDict # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值 print(type(obj.errors)) return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一:
from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.validators import RegexValidator class MyForm(Form): user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), initial=2, widget=widgets.Select ) def __init__(self, *args, **kwargs): super(MyForm,self).__init__(*args, **kwargs) # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),) # 或 self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
方式二:
使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现
from django import forms from django.forms import fields from django.forms import widgets from django.forms import models as form_model from django.core.exceptions import ValidationError from django.core.validators import RegexValidator class FInfo(forms.Form): authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())