我是 Django 新手,我想我在文档中遗漏了这一点。
问题是在内联表单集中我没有声明表单,只是传递两个模型来构造它。
我想知道如何使用内联表单集更改单个字段的小部件?
从 Django 1.6 开始,您可以使用
widgets
的 modelformset_factory
参数来自定义特定字段的小部件:
AuthorFormSet = modelformset_factory(Author, widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
inlineformset_factory
具有相同的参数(使用 modelformset_factory
):
AuthorInlineFormSet = inlineformset_factory(Author, Book, fields=['name'], widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
这是使用 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)
您可以子类化表单集并重写 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())
我知道这是一个非常古老的线程。现在我们可以使用 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
)