Skip to content

Commit

Permalink
Fixed #25985 -- Updated signature of ModelAdmin.formfield_for_* to ma…
Browse files Browse the repository at this point in the history
…ke request a positional argument.
  • Loading branch information
timgraham committed Dec 29, 2015
1 parent 300de96 commit dbb0df2
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 23 deletions.
10 changes: 4 additions & 6 deletions django/contrib/admin/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,15 +119,13 @@ def __init__(self):
overrides.update(self.formfield_overrides)
self.formfield_overrides = overrides

def formfield_for_dbfield(self, db_field, **kwargs):
def formfield_for_dbfield(self, db_field, request, **kwargs):
"""
Hook for specifying the form Field instance for a given database Field
instance.
If kwargs are given, they're passed to the form Field's constructor.
"""
request = kwargs.pop("request", None)

# If the field specifies choices, we don't need to look for special
# admin widgets - we just need to use a select widget of some kind.
if db_field.choices:
Expand Down Expand Up @@ -177,7 +175,7 @@ def formfield_for_dbfield(self, db_field, **kwargs):
# For any other type of field, just call its formfield() method.
return db_field.formfield(**kwargs)

def formfield_for_choice_field(self, db_field, request=None, **kwargs):
def formfield_for_choice_field(self, db_field, request, **kwargs):
"""
Get a form Field for a database Field that has declared choices.
"""
Expand Down Expand Up @@ -208,7 +206,7 @@ def get_field_queryset(self, db, db_field, request):
return db_field.remote_field.model._default_manager.using(db).order_by(*ordering)
return None

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""
Get a form Field for a ForeignKey.
"""
Expand All @@ -229,7 +227,7 @@ def formfield_for_foreignkey(self, db_field, request=None, **kwargs):

return db_field.formfield(**kwargs)

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
def formfield_for_manytomany(self, db_field, request, **kwargs):
"""
Get a form Field for a ManyToManyField.
"""
Expand Down
5 changes: 2 additions & 3 deletions django/contrib/gis/admin/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,18 @@ def media(self):
media.add_js(self.extra_js)
return media

def formfield_for_dbfield(self, db_field, **kwargs):
def formfield_for_dbfield(self, db_field, request, **kwargs):
"""
Overloaded from ModelAdmin so that an OpenLayersWidget is used
for viewing/editing 2D GeometryFields (OpenLayers 2 does not support
3D editing).
"""
if isinstance(db_field, models.GeometryField) and db_field.dim < 3:
kwargs.pop('request', None)
# Setting the widget with the newly defined widget.
kwargs['widget'] = self.get_map_widget(db_field)
return db_field.formfield(**kwargs)
else:
return super(GeoModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
return super(GeoModelAdmin, self).formfield_for_dbfield(db_field, request, **kwargs)

def get_map_widget(self, db_field):
"""
Expand Down
16 changes: 8 additions & 8 deletions docs/topics/db/multi-db.txt
Original file line number Diff line number Diff line change
Expand Up @@ -571,15 +571,15 @@ multiple-database support::
# Tell Django to look for objects on the 'other' database.
return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using)

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
# Tell Django to populate ForeignKey widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs)
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs)

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
def formfield_for_manytomany(self, db_field, request, **kwargs):
# Tell Django to populate ManyToMany widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs)

The implementation provided here implements a multi-database strategy
where all objects of a given type are stored on a specific database
Expand All @@ -596,15 +596,15 @@ Inlines can be handled in a similar fashion. They require three customized metho
# Tell Django to look for inline objects on the 'other' database.
return super(MultiDBTabularInline, self).get_queryset(request).using(self.using)

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
# Tell Django to populate ForeignKey widgets using a query
# on the 'other' database.
return super(MultiDBTabularInline, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs)
return super(MultiDBTabularInline, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs)

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
def formfield_for_manytomany(self, db_field, request, **kwargs):
# Tell Django to populate ManyToMany widgets using a query
# on the 'other' database.
return super(MultiDBTabularInline, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)
return super(MultiDBTabularInline, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs)

Once you've written your model admin definitions, they can be
registered with any ``Admin`` instance::
Expand Down
12 changes: 6 additions & 6 deletions tests/admin_ordering/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ def tearDown(self):
site.unregister(Band)

def check_ordering_of_field_choices(self, correct_ordering):
fk_field = site._registry[Song].formfield_for_foreignkey(Song.band.field)
m2m_field = site._registry[Song].formfield_for_manytomany(Song.other_interpreters.field)
fk_field = site._registry[Song].formfield_for_foreignkey(Song.band.field, request=None)
m2m_field = site._registry[Song].formfield_for_manytomany(Song.other_interpreters.field, request=None)

self.assertListEqual(list(fk_field.queryset), correct_ordering)
self.assertListEqual(list(m2m_field.queryset), correct_ordering)
Expand Down Expand Up @@ -159,15 +159,15 @@ def test_custom_queryset_still_wins(self):
"""Test that custom queryset has still precedence (#21405)"""
class SongAdmin(admin.ModelAdmin):
# Exclude one of the two Bands from the querysets
def formfield_for_foreignkey(self, db_field, **kwargs):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'band':
kwargs["queryset"] = Band.objects.filter(rank__gt=2)
return super(SongAdmin, self).formfield_for_foreignkey(db_field, **kwargs)
return super(SongAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

def formfield_for_manytomany(self, db_field, **kwargs):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == 'other_interpreters':
kwargs["queryset"] = Band.objects.filter(rank__gt=2)
return super(SongAdmin, self).formfield_for_foreignkey(db_field, **kwargs)
return super(SongAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

class StaticOrderingBandAdmin(admin.ModelAdmin):
ordering = ('rank',)
Expand Down

0 comments on commit dbb0df2

Please sign in to comment.