内容概要:
1.Django Form如何自定义验证字段
2.Django Form如何动态的显示数据库中新插入的数据
3.Tyrion
Django的Form(用于验证用户请求合法性的一个组件)
Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息),判断字段类型、长度、格式是否正确
- 保留页面信息
- 设置页面显示的初始化内容
1.如何自定义验证字段
自定制验证:
- 单一字段 def clean_字段名(self):
- 组合字段 def _post_clean(self):
- 组合字段 def clean(self):
forms.py中
#专门建forms.py文件,用于放各个模块的字段 from django import forms from django.core.exceptions import ValidationError from django.forms import fields class UserForm(forms.Form): # username = forms.CharField(max_length=32) forms.或者fields.都可以 username = fields.CharField(max_length=32,label='用户名') email = fields.EmailField(label='邮箱') ''' # 自定义验证规则方法一: 可以自定义方法来验证 单个字段 在错误信息级别进行详细的定制,但是它实际最基础的验证还是已经在forms.Form中已经完成: # forms模块内部有 clean_字段名() 方法,所以可以这样自定义验证: def clean_username(self): value = self.cleaned_data['username'] if value =='root': return value else: raise ValidationError('你不是管理员。。。') #主动跑出异常让error接收,必须带参数 ''' ''' #自定义验证规则方法二:可以自定义_post_clean(self)或者clean() 方法来验证 多个字段组合错误 在错误信息级别进行详细的定制使用_post_clean() def _post_clean(self): v1 = self.cleaned_data['username'] v2 = self.cleaned_data['email'] if v1 =='root' and v2 == 'root@live.com': #用户名或密码不匹配时会报 KeyError 错误 pass else: self.add_error('__all__',ValidationError('用户名或邮箱错误。。。')) #仿造_clean_fields(self)函数写的 #必须是 __all__,否则出不来 ''' # 自定义验证规则方法三: clean() 方法来验证 多个字段组合错误,这样重写clean()方法后,clean里面的数据就不是正确数据了,而数据在cleaned_data里面了 def clean(self): v1 = self.cleaned_data['username'] v2 = self.cleaned_data['email'] if v1 == 'root' and v2 == 'root@live.com': # 用户名或密码不匹配时会报 KeyError 错误 pass else: raise ValidationError('用户名或邮箱错误!!!') return self.cleaned_data
views文件夹 ==>fm.py中
from django.shortcuts import render from app01 import forms #引入forms.py模块 def index(request): if request.method =='GET': obj = forms.UserForm() return render(request,'fm.html',{'obj':obj}) elif request.method =='POST': obj = forms.UserForm(request.POST) # 以前的做法: if obj.is_valid(): data = obj.clean() # print(data) else: print(obj.errors) # print(obj.cleaned_data) 自定义验证规则方法三: 改写 clean() 方法来验证 多个字段组合错误,这样重写clean()方法后, # clean里面的数据就不是正确数据了,而数据在cleaned_data里面了 return render(request, 'fm.html', {'obj': obj})
fm.html中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#方式一:#} {# {{ obj.username }}#} {# {{ obj.email }}#} {#方式二:将obj里面的每一个对象简单粗暴的分别以**标签展示#} {# {{ obj.as_p }}#} {# {{ obj.as_ul }}#} {#<table>#} {# {{ obj.as_table }}#} {#</table>#} <form method="post" action="/fm/"> {% csrf_token %} {{ obj.as_p }} <input type="submit" value="提交"> </form> </body> </html>
urls.py中
from django.conf.urls import url from django.contrib import admin from app01.views import fm urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^fm/', fm.index), ]
2.如何动态的显示数据库中新插入的数据?
定义init方法,先继承执行父类方法,再从数据库中取值
在forms.py文件中
''' 专门建forms.py文件,用于放各个模块的字段 内容概要: 1.自定义验证规则 2.如何实时同步数据库数据 ''' from django import forms from django.core.exceptions import ValidationError from django.forms import fields from app01 import models class UserForm(forms.Form): # username = forms.CharField(max_length=32) forms.或者fields.都可以 username = fields.CharField(max_length=32,label='用户名') email = fields.EmailField(label='邮箱') user_type = fields.ChoiceField(choices=models.UserType.objects.values_list('id', 'name')) # 例如:让其user_type数据 实时更新 的方法,定义init方法,先继承执行父类方法,再从数据库中取值: def __init__(self, *args, **kwargs): super(UserForm, self).__init__(*args, **kwargs) self.fields['user_type'].widget.choices = models.UserType.objects.all().values_list('id', 'name')
form组件 补充知识:http://www.cnblogs.com/wupeiqi/articles/6144178.html
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado、Django、Flask、Bottle Web框架。
http://www.cnblogs.com/wupeiqi/p/5938916.html