#29901: InlineModelAdmin.get_formset do not work with custom widgets passed in
kwargs
---------------------------------------------+------------------------
Reporter: Javier Matos Odut | Owner: nobody
Type: Uncategorized | Status: new
Component: contrib.admin | Version: 2.1
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 1
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 1
UI/UX: 0 |
---------------------------------------------+------------------------
InlineModelAdmin class has get_formset method that will create a formset
based on the parameters given.
django.contrib.admin.options.InlineModelAdmin.get_formset is called with
widgets and then:
> django.forms.models.inlineformset_factory (Ok here as widgets are
passed)
> django.forms.models.modelformset_factory (Ok here as widgets are passed)
> django.forms.models.modelform_factory (Ok here as widgets are passed)
> django.forms.models.ModelFormMetaclass.__new__ (Ok as widgets are passed
as attrs)
> django.forms.models.fields_for_model (Ok here too)
> django.contrib.admin.options.BaseModelAdmin.formfield_for_dbfield (Ok
here too as widget is received in kwargs)
Then here comes the problem:
> django.contrib.admin.options.BaseModelAdmin.formfield_for_foreignkey
{{{
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""
Get a form Field for a ForeignKey.
"""
db = kwargs.get('using')
if db_field.name in self.get_autocomplete_fields(request):
kwargs['widget'] = AutocompleteSelect(db_field.remote_field,
self.admin_site, using=db)
elif db_field.name in self.raw_id_fields:
kwargs['widget'] =
widgets.ForeignKeyRawIdWidget(db_field.remote_field, self.admin_site,
using=db)
elif db_field.name in self.radio_fields:
kwargs['widget'] = widgets.AdminRadioSelect(attrs={
'class': get_ul_class(self.radio_fields[db_field.name]),
})
kwargs['empty_label'] = _('None') if db_field.blank else None
if 'queryset' not in kwargs:
queryset = self.get_field_queryset(db, db_field, request)
if queryset is not None:
kwargs['queryset'] = queryset
return db_field.formfield(**kwargs)
}}}
This code just ignores the widget sent.
How to fix this? Just change that method to the following:
{{{
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""
Get a form Field for a ForeignKey.
"""
db = kwargs.get('using')
if 'widget' not in kwargs:
if db_field.name in self.get_autocomplete_fields(request):
kwargs['widget'] =
AutocompleteSelect(db_field.remote_field, self.admin_site, using=db)
elif db_field.name in self.raw_id_fields:
kwargs['widget'] =
widgets.ForeignKeyRawIdWidget(db_field.remote_field, self.admin_site,
using=db)
elif db_field.name in self.radio_fields:
kwargs['widget'] = widgets.AdminRadioSelect(attrs={
'class':
get_ul_class(self.radio_fields[db_field.name]),
})
kwargs['empty_label'] = _('None') if db_field.blank else
None
if 'queryset' not in kwargs:
queryset = self.get_field_queryset(db, db_field, request)
if queryset is not None:
kwargs['queryset'] = queryset
return db_field.formfield(**kwargs)
}}}
With {{{if 'widget' not in kwargs}}} I let any widget set to be used by
default instead of assigning a new one. That is the only change to fix it.
This way now I am able to use my TabularInline and override get_formset to
show my fields with custom widgets.
--
Ticket URL: <https://code.djangoproject.com/ticket/29901>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/054.603fb60a50b2c9c499363d9bc16d9183%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.