Ticket #9969: 9969-admin-bugs-with-nested-choices-r10283.diff
File 9969-admin-bugs-with-nested-choices-r10283.diff, 6.2 KB (added by , 16 years ago) |
---|
-
django/contrib/admin/filterspecs.py
diff -r f44ec14ec084 django/contrib/admin/filterspecs.py
a b 90 90 yield {'selected': self.lookup_val is None, 91 91 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 92 92 'display': _('All')} 93 for k, v in self.field. choices:93 for k, v in self.field.flatchoices: 94 94 yield {'selected': smart_unicode(k) == self.lookup_val, 95 95 'query_string': cl.get_query_string({self.lookup_kwarg: k}), 96 96 'display': v} -
django/contrib/admin/templatetags/admin_list.py
diff -r f44ec14ec084 django/contrib/admin/templatetags/admin_list.py
a b 205 205 result_repr = EMPTY_CHANGELIST_VALUE 206 206 # Fields with choices are special: Use the representation 207 207 # of the choice. 208 elif f. choices:209 result_repr = dict(f. choices).get(field_val, EMPTY_CHANGELIST_VALUE)208 elif f.flatchoices: 209 result_repr = dict(f.flatchoices).get(field_val, EMPTY_CHANGELIST_VALUE) 210 210 else: 211 211 result_repr = escape(field_val) 212 212 if force_unicode(result_repr) == '': -
tests/regressiontests/admin_views/customadmin.py
diff -r f44ec14ec084 tests/regressiontests/admin_views/customadmin.py
a b 28 28 site.register(models.Article, models.ArticleAdmin) 29 29 site.register(models.Section, inlines=[models.ArticleInline]) 30 30 site.register(models.Thing, models.ThingAdmin) 31 site.register(models.Fabric, models.FabricAdmin) -
new file tests/regressiontests/admin_views/fixtures/admin-views-fabrics.xml
diff -r f44ec14ec084 tests/regressiontests/admin_views/fixtures/admin-views-fabrics.xml
- + 1 <?xml version="1.0" encoding="utf-8"?> 2 <django-objects version="1.0"> 3 <object pk="1" model="admin_views.fabric"> 4 <field type="CharField" name="surface">x</field> 5 </object> 6 <object pk="2" model="admin_views.fabric"> 7 <field type="CharField" name="surface">y</field> 8 </object> 9 <object pk="3" model="admin_views.fabric"> 10 <field type="CharField" name="surface">plain</field> 11 </object> 12 </django-objects> -
tests/regressiontests/admin_views/models.py
diff -r f44ec14ec084 tests/regressiontests/admin_views/models.py
a b 134 134 135 135 class ThingAdmin(admin.ModelAdmin): 136 136 list_filter = ('color',) 137 138 class Fabric(models.Model): 139 NG_CHOICES = ( 140 ('Textured', ( 141 ('x', 'Horizontal'), 142 ('y', 'Vertical'), 143 ) 144 ), 145 ('plain', 'Smooth'), 146 ) 147 surface = models.CharField(max_length=20, choices=NG_CHOICES) 148 149 class FabricAdmin(admin.ModelAdmin): 150 list_display = ('surface',) 151 list_filter = ('surface',) 137 152 138 153 class Person(models.Model): 139 154 GENDER_CHOICES = ( … … 274 289 admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin) 275 290 admin.site.register(Podcast, PodcastAdmin) 276 291 admin.site.register(Parent, ParentAdmin) 292 admin.site.register(Fabric, FabricAdmin) 277 293 278 294 # We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2. 279 295 # That way we cover all four cases: -
tests/regressiontests/admin_views/tests.py
diff -r f44ec14ec084 tests/regressiontests/admin_views/tests.py
a b 21 21 from sets import Set as set 22 22 23 23 class AdminViewBasicTest(TestCase): 24 fixtures = ['admin-views-users.xml', 'admin-views-colors.xml' ]24 fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml'] 25 25 26 26 # Store the bit of the URL where the admin is registered as a class 27 27 # variable. That way we can test a second AdminSite just by subclassing … … 181 181 self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) 182 182 response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'}) 183 183 self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) 184 185 def testNamedGroupFieldChoicesChangeList(self): 186 """ 187 Ensures the admin changelist shows correct values in the relevant column 188 for rows corresponding to instances of a model in which a named group 189 has been used in the choices option of a field. 190 """ 191 response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit) 192 self.failUnlessEqual(response.status_code, 200) 193 self.failUnless( 194 '<a href="1/">Horizontal</a>' in response.content and 195 '<a href="2/">Vertical</a>' in response.content, 196 "Changelist table isn't showing the right human-readable values set by a model field 'choices' option named group." 197 ) 198 199 def testNamedGroupFieldChoicesFilter(self): 200 """ 201 Ensures the filter UI shows correctly when at least one named group has 202 been used in the choices option of a model field. 203 """ 204 response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit) 205 self.failUnlessEqual(response.status_code, 200) 206 self.failUnless( 207 '<div id="changelist-filter">' in response.content, 208 "Expected filter not found in changelist view." 209 ) 210 self.failUnless( 211 '<a href="?surface__exact=x">Horizontal</a>' in response.content and 212 '<a href="?surface__exact=y">Vertical</a>' in response.content, 213 "Changelist filter isn't showing options contained inside a model field 'choices' option named group." 214 ) 184 215 185 216 class CustomModelAdminTest(AdminViewBasicTest): 186 217 urlbit = "admin2"