Django--(4)表单

本文详细介绍了Django框架中表单与数据验证的工作原理,包括表单的绑定状态、字段属性验证、自定义逻辑验证及如何检查表单字段变更。通过实例展示了如何使用is_valid()函数和clean()方法进行数据合法性检查。

Django表单

视图-表单-模型之间的关系
在这里插入图片描述

表单绑定状态

Django 为继承 Form 类的表单维护了一个绑定(bound)状态

  1. 如果一个表单对象在实例化后被赋予过数据内容,则称该表单处于bound状态.
    只有处于bound状态 的表单才具有表单数据验证(validate data) 的功能
    已经处于bound状态 的表单不能再python代码中修改其数据,而只能由网页用户在页面中输入数据进行修改
  2. 如果未被赋予过数据内容,则表单处于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值