Dec 19, 2011

django ModelForm, model field, form field, widget

参考:
Model field reference
Form fields
Creating forms from models
Widgets

model fields and form fields

django model 有 model field, form 有 form field。
两者密切联系,使用 ModelForm 时,一种 model field 会默认映射到一种 form filed,这两种 fields 在很多情况下
名字是相同,但也有例外。



例外

ForeignKey  ->    ModelChoiceField
ManyToManyField   ->   ModelMultipleChoiceField (see below)
各种 IntegerFiled   ->    IntegerField
TextField     ->   CharField with widget=forms.Textarea

form field

form fields 除了以上显示的,还有如下

  • ChoiceField
  • TypedChoiceField
  • MultipleChoiceField
  • TypedMultipleChoiceField

以上四个必须带有参数 choices
我猜测 ModelChoiceField 也是 choice field,只不过绑定了 Model.field 的choices
Typed 支持 coerce 和 empty_value 参数


  • RegexField 接受参数 regex。做什么用?



  • ComboField
  • MultiValueField
  • SplitDateTimeField

model fields and form fields 的参数

model field 和 form field 的参数也不同
比如是否可以为空
model field 为 blank
form field 为 required

model field 的参数(常用的)

  • blank 是否可空,默认否
  • verbose_name 如果不提供,默认为 field name。使用ModelForm 时,该项自动成为 label
  • choices
  • db_column   database column 的名字
  • default 默认值
  • editable 能否编辑,默认可以
  • error_message
  • help_text
  • primary_key 隐含 null=False, unique = True。不设 primary_key,实际上django自动添加一个IntegerField作为主key
  • unique 不能重复
  • validators
form field 的参数
  • required
  • label 用在表格中的显示
  • initial  初始值
  • widget
  • help_text
  • error_messages
  • validators
当使用 ModelForm 时,
blank 决定 required
verbose_name 决定 label
help_text 决定 help_text
choices 使得 form field 的widget 为 select;并且 model.field.blank=True,form field 会出现一个blank choice;即使你设置 form.field.required = True也没用。要消除 blank choice 必须设置 model.field.blank = False and model.field.default = default_vaule

ModelForm

ModelForm 很灵活,可以
  • 只选择部分 fields 呈现在表格中,方法:在 meta 中采用 fields = {},或者  exclude = {}
  • 改变 field 在表格中的顺序,方法:在 meta 中采用 fields = {},在括号中的顺序即表中的顺序
  • 更改 model.field 默认对应的 form.field,方法:在 ModelForm 中覆盖 field
  • 更改 form.field 的参数,方法:在 ModelForm 中覆盖 field
  • 更改 form.filed 的 widget,方法:在 meta 中 widget = {}
如果覆盖 field,则默认参数为 form.field 的默认参数,而不是从 model.field 那里提取。因此如果你要保持 model.field 的参数,要手动写入。
如果覆盖 field,widget 要在覆盖的地方填写,而不能在 meta 中。

Widget



每一种 form field 都有默认的 widget。 model.field 没有widget 参数。

一种 form field 可以选择不同的  widget
比如 charField 可以选择 TextInput 或 TextArea
带有 choices 的 fields 可以选择 select 或者 radio



  • TextInput
  • PasswordInput
  • HiddenInput
  • MultipleHiddenInput
  • FileInput
  • ClearableFileInput
  • DateInput
  • DateTimeInput
  • TimeInput
  • Textarea
  • CheckboxInput
  • Select
  • NullBooleanSelect
  • SelectMultiple
  • RadioSelect
  • CheckboxSelectMultiple
  • MultiWidget
  • SplitDateTimeWidget
  • SplitHiddenDateTimeWidget
  • SelectDateWidget
widget 可以添加 CSS
这很有用,特别是添加 class,然后采用css来变换格式
class CommentForm(forms.Form):
    name = forms.CharField(
                widget=forms.TextInput(attrs={'class':'special'}))
    url = forms.URLField()
    comment = forms.CharField(
               widget=forms.TextInput(attrs={'size':'40'}))


    0 comments: