Django:如何更改内联表单集中的字段小部件

问题描述 投票:0回答:5

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

python django forms inline-formset
5个回答
21
投票

从 Django 1.6 开始,您可以使用

widgets
modelformset_factory
参数来自定义特定字段的小部件:

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})
})

6
投票

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

3
投票

您需要在

Meta
类中定义一个表单并更新小部件。查看覆盖默认字段类型或小部件


2
投票

您可以子类化表单集并重写 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())

0
投票

我知道这是一个非常古老的线程。现在我们可以使用 django ModelForm 本身来做到这一点。

使用小部件在

forms.py
中添加模型表单。

forms.py

class QAForm(forms.ModelForm):
    class Meta:
        model = QA
        fields = ['question', 'answer', 'status']
        widgets = {
            'question': widgets.Textarea(
                attrs={
                    'class': 'form-control',
                    'rows': 3,
                    'cols': 40
                }
            ),
            'answer': widgets.Textarea(
                attrs={
                    'class': 'form-control',
                    'rows': 3,
                    'cols': 40
                }
            ),
            'status': widgets.Select(
                attrs={
                    'class': 'form-select'
                }
            )
        }

使用

from
参数为您的
modelformset_factory
传递它,就像您的
views.py

中所示

views.py

QAFormSet = modelformset_factory(
                                 models.QA,
                                 fields=["question", "answer", "status"],
                                 form=QAForm
                                )
© www.soinside.com 2019 - 2024. All rights reserved.