我是Django的新手,我想我在文档中遗漏了这个 .问题是在inline-formset中我没有声明一个表单,只需传递两个模型来构造它 .我想知道如何使用内联formset更改单个字段的窗口小部件?
As of Django 1.6,您可以使用 modelformset_factory 的 widgets 参数来自定义特定字段的窗口小部件:
modelformset_factory
widgets
AuthorFormSet = modelformset_factory(Author, widgets={ 'name': Textarea(attrs={'cols': 80, 'rows': 20}) })
和therefore inlineformset_factory (使用 modelformset_factory )的相同参数:
inlineformset_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
Meta
您可以子类化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())
4 回答
As of Django 1.6,您可以使用
modelformset_factory
的widgets
参数来自定义特定字段的窗口小部件:和therefore
inlineformset_factory
(使用modelformset_factory
)的相同参数:这是使用formfield_callback自定义一个字段的示例:
您需要在
Meta
类中定义表单和更新小部件 . 看Overriding the default field types or widgets您可以子类化formset并覆盖add_fields方法 . 这对我有用,我正在使用Django 1.5 :( .