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

来源:互联网 发布:php时间戳转换月份 编辑:程序博客网 时间:2024/06/04 18:50

1、The Forms API

原文:https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.clean

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 adminfrom .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 adminfrom .models import Questionadmin.site.register(Question);

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

代码:

from django.contrib import adminfrom .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);
结果:




原创粉丝点击