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
- required
- label 用在表格中的显示
- initial 初始值
- widget
- help_text
- error_messages
- validators
当使用 ModelForm 时,
blank 决定 requiredverbose_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,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
这很有用,特别是添加 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:
Post a Comment