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);
结果: