Author: carljm
Date: 2011-09-21 07:00:58 -0700 (Wed, 21 Sep 2011)
New Revision: 16860

Modified:
   django/trunk/django/contrib/admin/options.py
   django/trunk/tests/regressiontests/admin_inlines/admin.py
   django/trunk/tests/regressiontests/admin_inlines/models.py
   django/trunk/tests/regressiontests/admin_inlines/tests.py
Log:
Fixed #16838 -- Corrected broken add-another inline JS in admin with 
related_name="+". Thanks jamesp for report and patch.

Modified: django/trunk/django/contrib/admin/options.py
===================================================================
--- django/trunk/django/contrib/admin/options.py        2011-09-21 01:37:17 UTC 
(rev 16859)
+++ django/trunk/django/contrib/admin/options.py        2011-09-21 14:00:58 UTC 
(rev 16860)
@@ -926,7 +926,7 @@
             for FormSet, inline in zip(self.get_formsets(request), 
self.inline_instances):
                 prefix = FormSet.get_default_prefix()
                 prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
+                if prefixes[prefix] != 1 or not prefix:
                     prefix = "%s-%s" % (prefix, prefixes[prefix])
                 formset = FormSet(data=request.POST, files=request.FILES,
                                   instance=new_object,
@@ -955,7 +955,7 @@
                                        self.inline_instances):
                 prefix = FormSet.get_default_prefix()
                 prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
+                if prefixes[prefix] != 1 or not prefix:
                     prefix = "%s-%s" % (prefix, prefixes[prefix])
                 formset = FormSet(instance=self.model(), prefix=prefix,
                                   queryset=inline.queryset(request))
@@ -1025,7 +1025,7 @@
                                        self.inline_instances):
                 prefix = FormSet.get_default_prefix()
                 prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
+                if prefixes[prefix] != 1 or not prefix:
                     prefix = "%s-%s" % (prefix, prefixes[prefix])
                 formset = FormSet(request.POST, request.FILES,
                                   instance=new_object, prefix=prefix,
@@ -1046,7 +1046,7 @@
             for FormSet, inline in zip(self.get_formsets(request, obj), 
self.inline_instances):
                 prefix = FormSet.get_default_prefix()
                 prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
+                if prefixes[prefix] != 1 or not prefix:
                     prefix = "%s-%s" % (prefix, prefixes[prefix])
                 formset = FormSet(instance=obj, prefix=prefix,
                                   queryset=inline.queryset(request))

Modified: django/trunk/tests/regressiontests/admin_inlines/admin.py
===================================================================
--- django/trunk/tests/regressiontests/admin_inlines/admin.py   2011-09-21 
01:37:17 UTC (rev 16859)
+++ django/trunk/tests/regressiontests/admin_inlines/admin.py   2011-09-21 
14:00:58 UTC (rev 16860)
@@ -101,6 +101,14 @@
     inlines = [ChapterInline]
 
 
+class ConsigliereInline(admin.TabularInline):
+    model = Consigliere
+
+
+class SottoCapoInline(admin.TabularInline):
+    model = SottoCapo
+
+
 site.register(TitleCollection, inlines=[TitleInline])
 # Test bug #12561 and #12778
 # only ModelAdmin media
@@ -115,3 +123,4 @@
 site.register(Fashionista, inlines=[InlineWeakness])
 site.register(Holder4, Holder4Admin)
 site.register(Author, AuthorAdmin)
+site.register(CapoFamiglia, inlines=[ConsigliereInline, SottoCapoInline])

Modified: django/trunk/tests/regressiontests/admin_inlines/models.py
===================================================================
--- django/trunk/tests/regressiontests/admin_inlines/models.py  2011-09-21 
01:37:17 UTC (rev 16859)
+++ django/trunk/tests/regressiontests/admin_inlines/models.py  2011-09-21 
14:00:58 UTC (rev 16860)
@@ -122,3 +122,17 @@
 class Chapter(models.Model):
     novel = models.ForeignKey(Novel)
 
+
+# Models for #16838
+class CapoFamiglia(models.Model):
+    name = models.CharField(max_length=100)
+
+
+class Consigliere(models.Model):
+    name = models.CharField(max_length=100)
+    capo_famiglia = models.ForeignKey(CapoFamiglia, related_name='+')
+
+
+class SottoCapo(models.Model):
+    name = models.CharField(max_length=100)
+    capo_famiglia = models.ForeignKey(CapoFamiglia, related_name='+')

Modified: django/trunk/tests/regressiontests/admin_inlines/tests.py
===================================================================
--- django/trunk/tests/regressiontests/admin_inlines/tests.py   2011-09-21 
01:37:17 UTC (rev 16859)
+++ django/trunk/tests/regressiontests/admin_inlines/tests.py   2011-09-21 
14:00:58 UTC (rev 16860)
@@ -4,7 +4,8 @@
 
 # local test models
 from models import (Holder, Inner, Holder2, Inner2, Holder3,
-    Inner3, Person, OutfitItem, Fashionista, Teacher, Parent, Child)
+    Inner3, Person, OutfitItem, Fashionista, Teacher, Parent, Child,
+    CapoFamiglia, Consigliere, SottoCapo)
 from admin import InnerInline
 
 
@@ -115,6 +116,32 @@
         self.assertContains(response, '<p class="help">Awesome stacked help 
text is awesome.</p>', 4)
         self.assertContains(response, '<img 
src="/static/admin/img/icon-unknown.gif" class="help help-tooltip" width="10" 
height="10" alt="(Awesome tabular help text is awesome.)" title="Awesome 
tabular help text is awesome." />', 1)
 
+    def test_non_related_name_inline(self):
+        """
+        Ensure that multiple inlines with related_name='+' have correct form
+        prefixes. Bug #16838.
+        """
+        response = self.client.get('/admin/admin_inlines/capofamiglia/add/')
+
+        self.assertContains(response,
+                '<input type="hidden" name="-1-0-id" id="id_-1-0-id" />')
+        self.assertContains(response,
+                '<input type="hidden" name="-1-0-capo_famiglia" '
+                'id="id_-1-0-capo_famiglia" />')
+        self.assertContains(response,
+                '<input id="id_-1-0-name" type="text" class="vTextField" '
+                'name="-1-0-name" maxlength="100" />')
+
+        self.assertContains(response,
+                '<input type="hidden" name="-2-0-id" id="id_-2-0-id" />')
+        self.assertContains(response,
+                '<input type="hidden" name="-2-0-capo_famiglia" '
+                'id="id_-2-0-capo_famiglia" />')
+        self.assertContains(response,
+                '<input id="id_-2-0-name" type="text" class="vTextField" '
+                'name="-2-0-name" maxlength="100" />')
+
+
 class TestInlineMedia(TestCase):
     urls = "regressiontests.admin_inlines.urls"
     fixtures = ['admin-views-users.xml']

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to