首页 文章

Django:如何更改内联Formset中的字段小部件

提问于
浏览
9

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

4 回答

  • 3

    As of Django 1.6,您可以使用 modelformset_factorywidgets 参数来自定义特定字段的窗口小部件:

    AuthorFormSet = modelformset_factory(Author, widgets={
        'name': Textarea(attrs={'cols': 80, 'rows': 20})
    })
    

    therefore inlineformset_factory (使用 modelformset_factory )的相同参数:

    AuthorInlineFormSet = inlineformset_factory(Author, Book, fields=['name'], widgets={
        'name': Textarea(attrs={'cols': 80, 'rows': 20})
    })
    
  • 1

    这是使用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)
    
  • 5

    您需要在 Meta 类中定义表单和更新小部件 . 看Overriding the default field types or widgets

  • 15

    您可以子类化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())
    

相关问题