Django表单
视图-表单-模型之间的关系
表单绑定状态
Django 为继承 Form 类的表单维护了一个绑定(bound)状态
- 如果一个表单对象在实例化后被赋予过数据内容,则称该表单处于bound状态.
只有处于bound状态 的表单才具有表单数据验证(validate data) 的功能
已经处于bound状态 的表单不能再python代码中修改其数据,而只能由网页用户在页面中输入数据进行修改 - 如果未被赋予过数据内容,则表单处于unbound状态
只有处于unbound状态的表单才能被赋予数据,使该表单变为 bound 状态
表单数据验证
Django 表单数据验证是指在服务器端用Python代码验证表单中数据的合法性
字段属性验证
字段属性验证要求通过model中字段的约束完成,在 Form 渲染的过程中Django会自动根据验证约束要求验证字段内容,如果字段不符合要求,则会自动显示错误信息并提示用户
is_valid()
函数 获取表单验证是否通过的信息
#在 app/views.py
def viewer(request):
if request.method == 'POST':
form = MomentForm(request.POST)
if form.is_valid():
# 此处编写正常的表单提交的业务逻辑
# 处理完成后 redirect 重定向页面
else
# 此处编写数据不完全的业务逻辑,比如显示特定的错误信息等
#用render() 函数渲染表单页面
自定义逻辑验证
如果开发者需要在 Django 进行表数据验证时判断自定义的复杂逻辑
则可以通过重载 Form 子类的 clean() 函数 进行定义
# app/forms.py
# -*- coding: utf-8 -*-
from django.form import ModelForm,ValidationError
from app.models import Moment
class MomentForm(ModelForm):
class Meta:
model = Moment
field = '__all__'
def clean(self):
cleaned_data = super(MomentForm,self).clean()
content = cleaned_data.get("content")
if content is None:
raise ValidationError("请输入Content内容!") #抛出异常结束本次验证
elif content.find("ABCD")>0:
raise ValidationError("不能输入敏感字ABCD!")
return cleaned_data
检查变更字段
当试图函数收到表单的 Post
提交时,经常需要通过用户是否修改了表单然后进行相应的处理
has_changed()
判断用户是否修改过表单数据
# app/views.py
def view_moment(request):
data = {'content':'Please input the content',
'user_name':'匿名',
'kind':'Python技术'}
f = MomentForm(request.Post,inital = data )
if f.haschange():
#在此编写保存 f 的代码
request.Post
Django从其中解析出用户的输入数据
initial
Form的初始值,在调用has_change时,Django用initial 中的字段值与初始值相比较,如果有变化返回True