#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.

Reply via email to