【发布时间】:2012-08-16 18:58:30
【问题描述】:
我是 Django 新手,我认为我在文档中遗漏了这一点。
问题是在 inline-formset 中我没有声明一个表单,只是传递了两个模型来构造它。
我想知道如何使用内联表单集更改单个字段的小部件?
【问题讨论】:
标签: python django forms inline-formset
我是 Django 新手,我认为我在文档中遗漏了这一点。
问题是在 inline-formset 中我没有声明一个表单,只是传递了两个模型来构造它。
我想知道如何使用内联表单集更改单个字段的小部件?
【问题讨论】:
标签: python django forms inline-formset
您可以子类化表单集并覆盖 add_fields 方法。这对我有用,我正在使用 Django 1.5 :( .
AuthorInlineFormSet = inlineformset_factory(Author, Book)
class AuthorFormSet(AuthorInlineFormSet):
def add_fields(self, form, index):
super(ReferenceForm,self).add_fields(form,index)
form.fields["name"] = forms.CharField(widget=forms.TextInput())
【讨论】:
As of Django 1.6,您可以使用modelformset_factory 的widgets 参数来自定义特定字段的小部件:
AuthorFormSet = modelformset_factory(Author, widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
和thereforeinlineformset_factory的参数相同(使用modelformset_factory):
AuthorInlineFormSet = inlineformset_factory(Author, Book, fields=['name'], widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
【讨论】:
这是使用 formfield_callback 自定义一个字段的示例:
def formfield_callback(field):
if isinstance(field, models.ChoiceField) and field.name == 'target_field_name':
return fields.ChoiceField(choices = SAMPLE_CHOICES_LIST, label='Sample Label')
return field.formfield()
FormSet = inlineformset_factory(ModelA, ModelB, extra=1, formfield_callback = formfield_callback)
【讨论】:
您需要在Meta 类中定义一个表单和更新小部件。看Overriding the default field types or widgets
【讨论】:
formset(而不是modelformset。