I am new to Django and I think I am missing this in the docs.
The problem is that in inline-formset I dont declare a form, just pass two models to construct it.
I want
As of Django 1.6, you can use the widgets
parameter of modelformset_factory
in order to customize the widget of a particular field:
AuthorFormSet = modelformset_factory(Author, widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
and therefore the same parameter for inlineformset_factory
(which uses modelformset_factory
):
AuthorInlineFormSet = inlineformset_factory(Author, Book, fields=['name'], widgets={
'name': Textarea(attrs={'cols': 80, 'rows': 20})
})
This is an example of customizing one field using 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)
you can subclass the formset and override the add_fields method. This worked for me and I am using 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())
You need to define a form and update widget in the Meta
class. Look at Overriding the default field types or widgets