Django:如何更改内联表单集中的字段小部件
Posted
技术标签:
【中文标题】Django:如何更改内联表单集中的字段小部件【英文标题】:Django: How to change a field widget in a Inline Formset 【发布时间】:2012-08-16 18:58:30 【问题描述】:我是 Django 新手,我认为我在文档中遗漏了这一点。 问题是在 inline-formset 中我没有声明一个表单,只是传递了两个模型来构造它。 我想知道如何使用内联表单集更改单个字段的小部件?
【问题讨论】:
Django Inline Formsets using custom form的可能重复 【参考方案1】:您可以子类化表单集并覆盖 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())
【讨论】:
【参考方案2】: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)
)
【讨论】:
能否将您的答案更新到新版本 3.* ? 我已经用 inlineformset_factory(MotherModel, ChildModel, form=MyForm, extra=1) 解决了【参考方案3】:这是使用 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)
【讨论】:
【参考方案4】:您需要在Meta
类中定义一个表单和更新小部件。看Overriding the default field types or widgets
【讨论】:
感谢您的回答!但是如何指定要在 inline-formset 中使用的表单呢? @nsbm,您可以定义一个模型表单并从中创建formset
(而不是modelformset
。以上是关于Django:如何更改内联表单集中的字段小部件的主要内容,如果未能解决你的问题,请参考以下文章
我可以更改表单小部件类而不在 Django 中明确重新定义它吗?