Django------相关知识(三)

本文介绍了Django框架中的表单数据清理机制及其验证过程,并演示了如何使用clean_data属性获取经验证后的数据。此外,还展示了如何通过定制管理站点来改善表单字段的展示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、The Forms API


clean_data:表单类中的每个字段不仅负责验证数据,还负责“清理”数据——将其规范为一致格式。这是一个很好的特性,因为它允许一个特定字段的数据以多种

方式输入,总是产生一致的输出。例如,DateField将输入规范化为Python datetime.date对象。 无论您是否以“1994-07-15”格式传递一个字符串,datetime.date

对象或许多其他格式,DateField将始终将其标准化为datetime.date对象,只要它有效。一旦你创建了具有一组数据 并对其进行验证了的Form实例后,您可以通

过其clean_data属性访问(clean)干净的数据:
>>> data = {'subject': 'hello',
...         'message': 'Hi there',
...         'sender': 'foo@example.com',
...         'cc_myself': True}
>>> f = ContactForm(data)
>>> f.is_valid()
True
>>> f.cleaned_data
{'cc_myself': True, 'message': 'Hi there', 'sender': 'foo@example.com', 'subject': 'hello'}

请注意,任何基于文本的字段(如CharField或EmailField)始终将输入清理为字符串。 我们将在本文档的后面介绍编码含义。

如果您的数据未验证,则 clean_data字典仅包含有效字段
>>> data = {'subject': '',
...         'message': 'Hi there',
...         'sender': 'invalid email address',
...         'cc_myself': True}
>>> f = ContactForm(data)
>>> f.is_valid()
False
>>> f.cleaned_data
{'cc_myself': True, 'message': 'Hi there'}
clean_data将始终只包含Form中定义的字段的键,即使您在定义表单时传递额外的数据。 在这个例子中,我们将一堆额外的字段传递给ContactForm构造函

数,但是 clean_data只包含窗体的字段

>>> data = {'subject': 'hello',
...         'message': 'Hi there',
...         'sender': 'foo@example.com',
...         'cc_myself': True,
...         'extra_field_1': 'foo',
...         'extra_field_2': 'bar',
...         'extra_field_3': 'baz'}
>>> f = ContactForm(data)
>>> f.is_valid()
True
>>> f.cleaned_data # Doesn't contain extra_field_1, etc.
{'cc_myself': True, 'message': 'Hi there', 'sender': 'foo@example.com', 'subject': 'hello'}

表单有效时,clean_data将包含所有字段的键和值,即使数据中没有包含某些可选字段的值。 在这个例子中,数据字典不包含nick_name字段的值,但是

clean_data包含一个空值:

>>> from django import forms
>>> class OptionalPersonForm(forms.Form):
...     first_name = forms.CharField()
...     last_name = forms.CharField()
...     nick_name = forms.CharField(required=False)
>>> data = {'first_name': 'John', 'last_name': 'Lennon'}
>>> f = OptionalPersonForm(data)
>>> f.is_valid()
True
>>> f.cleaned_data
{'nick_name': '', 'first_name': 'John', 'last_name': 'Lennon'}

在上面的示例中,nick_name的clean_data值设置为空字符串,因为nick_name是CharField,CharField将空值视为空字符串。 每个字段类型都知道它

的“空白”值是什么 - 例如对于DateField,它是None而不是空字符串。 有关这种情况下每个字段行为的完整详细信息,请参阅下面“内置字段类”部分中每个字

段的“空值”笔记

您可以编写代码来对特定表单字段(基于其名称)或整体的形式(考虑各种字段的组合)执行验证。 有关这方面的更多信息,请参见表单和字段验证。

2、Django 1.10中文文档-第一个应用Part7-自定义管理站点

代码:

from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
	fields=['pub_date','question_text']#代表admin管理界面,表单的字段显示顺序,布局
admin.site.register(Question,QuestionAdmin);


代码为:

from django.contrib import admin
from .models import Question

admin.site.register(Question);

目前的表单只有两个字段可能看不出什么,但是对于一个字段很多的表单,设计一个直观合理的排序方式非常重要。并且在字段数据很多时,还可以将表单分割成多个字段的集合:

代码:

from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
	#fields=['pub_date','question_text']
	fieldsets=[
	(None,{'fields':['question_text']}),
	('Date information',{'fields':['pub_date']}),
	
	]
admin.site.register(Question,QuestionAdmin);
结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值