【问题标题】:Django: How to change a field widget in a Inline FormsetDjango:如何更改内联表单集中的字段小部件
【发布时间】:2012-08-16 18:58:30
【问题描述】:

我是 Django 新手,我认为我在文档中遗漏了这一点。
问题是在 inline-formset 中我没有声明一个表单,只是传递了两个模型来构造它。
我想知道如何使用内联表单集更改单个字段的小部件?

【问题讨论】:

标签: python django forms inline-formset


【解决方案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
      猜你喜欢
      • 2012-11-16
      • 2011-09-22
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 2015-10-01
      • 2015-12-05
      • 2018-03-08
      相关资源
      最近更新 更多