Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Changing the get_formset method to return a tuple that includes the f…
…ormsets inline, fixing ticket #20702
  • Loading branch information
tim-schilling committed Aug 13, 2013
1 parent a1831a1 commit ea7c7dc
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 15 deletions.
16 changes: 9 additions & 7 deletions django/contrib/admin/options.py
Expand Up @@ -504,7 +504,7 @@ def get_changelist_formset(self, request, **kwargs):

def get_formsets(self, request, obj=None):
for inline in self.get_inline_instances(request):
yield inline.get_formset(request, obj)
yield inline.get_formset(request, obj), inline

def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True):
return self.paginator(queryset, per_page, orphans, allow_empty_first_page)
Expand Down Expand Up @@ -941,7 +941,7 @@ def add_view(self, request, form_url='', extra_context=None):
form_validated = False
new_object = self.model()
prefixes = {}
for FormSet, inline in zip(self.get_formsets(request), inline_instances):
for FormSet, inline in self.get_formsets(request):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
Expand Down Expand Up @@ -969,7 +969,7 @@ def add_view(self, request, form_url='', extra_context=None):
initial[k] = initial[k].split(",")
form = ModelForm(initial=initial)
prefixes = {}
for FormSet, inline in zip(self.get_formsets(request), inline_instances):
for FormSet, inline in self.get_formsets(request):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
Expand Down Expand Up @@ -1029,7 +1029,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):

ModelForm = self.get_form(request, obj)
formsets = []
inline_instances = self.get_inline_instances(request)
used_inline_instances = []
if request.method == 'POST':
form = ModelForm(request.POST, request.FILES, instance=obj)
if form.is_valid():
Expand All @@ -1039,7 +1039,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
form_validated = False
new_object = obj
prefixes = {}
for FormSet, inline in zip(self.get_formsets(request, new_object), inline_instances):
for FormSet, inline in self.get_formsets(request, new_object):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
Expand All @@ -1049,6 +1049,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
queryset=inline.queryset(request))

formsets.append(formset)
used_inline_instances.append(inline)

if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, True)
Expand All @@ -1060,14 +1061,15 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
else:
form = ModelForm(instance=obj)
prefixes = {}
for FormSet, inline in zip(self.get_formsets(request, obj), inline_instances):
for FormSet, inline in self.get_formsets(request, obj):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(instance=obj, prefix=prefix,
queryset=inline.queryset(request))
formsets.append(formset)
used_inline_instances.append(inline)

adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
self.get_prepopulated_fields(request, obj),
Expand All @@ -1076,7 +1078,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
media = self.media + adminForm.media

inline_admin_formsets = []
for inline, formset in zip(inline_instances, formsets):
for inline, formset in zip(used_inline_instances, formsets):
fieldsets = list(inline.get_fieldsets(request, obj))
readonly = list(inline.get_readonly_fields(request, obj))
prepopulated = dict(inline.get_prepopulated_fields(request, obj))
Expand Down
6 changes: 3 additions & 3 deletions tests/regressiontests/generic_inline_admin/tests.py
Expand Up @@ -274,7 +274,7 @@ class EpisodeAdmin(admin.ModelAdmin):

ma = EpisodeAdmin(Episode, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['keywords', 'id', 'DELETE'])

def test_custom_form_meta_exclude(self):
Expand Down Expand Up @@ -304,7 +304,7 @@ class EpisodeAdmin(admin.ModelAdmin):

ma = EpisodeAdmin(Episode, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['url', 'keywords', 'id', 'DELETE'])

# Then, only with `ModelForm` -----------------
Expand All @@ -320,5 +320,5 @@ class EpisodeAdmin(admin.ModelAdmin):

ma = EpisodeAdmin(Episode, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['description', 'keywords', 'id', 'DELETE'])
2 changes: 1 addition & 1 deletion tests/regressiontests/modeladmin/admin.py
Expand Up @@ -30,7 +30,7 @@ def get_formsets(self, request, obj=None):
continue
# Do not return the concert inline
if isinstance(inline, SongInline):
yield inline.get_formset(request, obj)
yield inline.get_formset(request, obj), inline


site.register(Band, BandAdmin)
8 changes: 4 additions & 4 deletions tests/regressiontests/modeladmin/tests.py
Expand Up @@ -180,7 +180,7 @@ class BandAdmin(ModelAdmin):

ma = BandAdmin(Band, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['main_band', 'opening_band', 'id', 'DELETE',])

def test_custom_form_meta_exclude(self):
Expand Down Expand Up @@ -226,7 +226,7 @@ class BandAdmin(ModelAdmin):

ma = BandAdmin(Band, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['main_band', 'opening_band', 'day', 'id', 'DELETE',])

def test_custom_form_validation(self):
Expand Down Expand Up @@ -304,7 +304,7 @@ class BandAdmin(ModelAdmin):

ma = BandAdmin(Band, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['main_band', 'day', 'transport', 'id', 'DELETE',])

def test_queryset_override(self):
Expand Down Expand Up @@ -499,7 +499,7 @@ class BandAdmin(ModelAdmin):

ma = BandAdmin(Band, self.site)
self.assertEqual(
list(ma.get_formsets(request))[0]().forms[0].fields.keys(),
list(ma.get_formsets(request))[0][0]().forms[0].fields.keys(),
['extra', 'transport', 'id', 'DELETE', 'main_band'])

def test_override_inlines_with_get_formsets(self):
Expand Down

0 comments on commit ea7c7dc

Please sign in to comment.