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_factorywidgets 参数来自定义特定字段的小部件:

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 中明确重新定义它吗?

最初在 django 内联表单集中设置不同的外键值

如何修改 Django 中特定类型的所有内置表单字段的默认小部件?

使用模板渲染 django 小部件?

Django:如何显示内联表单集中每个模型对象的表单错误

Django admin 不同的内联用于更改和添加视图