mirror of
https://github.com/django/django.git
synced 2025-07-18 16:49:13 +00:00
[1.0.X] Fixed #9969: choices with options groups (added in [7977]) now work correctly in the admin with list_display and list_filter. Thanks, ramiro. Backport of r10318 from trunk; thanks, cramm.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10340 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
d0dce0257b
commit
eb24c7fd0c
@ -90,7 +90,7 @@ class ChoicesFilterSpec(FilterSpec):
|
|||||||
yield {'selected': self.lookup_val is None,
|
yield {'selected': self.lookup_val is None,
|
||||||
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
|
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
|
||||||
'display': _('All')}
|
'display': _('All')}
|
||||||
for k, v in self.field.choices:
|
for k, v in self.field.flatchoices:
|
||||||
yield {'selected': smart_unicode(k) == self.lookup_val,
|
yield {'selected': smart_unicode(k) == self.lookup_val,
|
||||||
'query_string': cl.get_query_string({self.lookup_kwarg: k}),
|
'query_string': cl.get_query_string({self.lookup_kwarg: k}),
|
||||||
'display': v}
|
'display': v}
|
||||||
|
@ -205,8 +205,8 @@ def items_for_result(cl, result):
|
|||||||
result_repr = EMPTY_CHANGELIST_VALUE
|
result_repr = EMPTY_CHANGELIST_VALUE
|
||||||
# Fields with choices are special: Use the representation
|
# Fields with choices are special: Use the representation
|
||||||
# of the choice.
|
# of the choice.
|
||||||
elif f.choices:
|
elif f.flatchoices:
|
||||||
result_repr = dict(f.choices).get(field_val, EMPTY_CHANGELIST_VALUE)
|
result_repr = dict(f.flatchoices).get(field_val, EMPTY_CHANGELIST_VALUE)
|
||||||
else:
|
else:
|
||||||
result_repr = escape(field_val)
|
result_repr = escape(field_val)
|
||||||
if force_unicode(result_repr) == '':
|
if force_unicode(result_repr) == '':
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<django-objects version="1.0">
|
||||||
|
<object pk="1" model="admin_views.fabric">
|
||||||
|
<field type="CharField" name="surface">x</field>
|
||||||
|
</object>
|
||||||
|
<object pk="2" model="admin_views.fabric">
|
||||||
|
<field type="CharField" name="surface">y</field>
|
||||||
|
</object>
|
||||||
|
<object pk="3" model="admin_views.fabric">
|
||||||
|
<field type="CharField" name="surface">plain</field>
|
||||||
|
</object>
|
||||||
|
</django-objects>
|
@ -134,6 +134,21 @@ class Thing(models.Model):
|
|||||||
class ThingAdmin(admin.ModelAdmin):
|
class ThingAdmin(admin.ModelAdmin):
|
||||||
list_filter = ('color',)
|
list_filter = ('color',)
|
||||||
|
|
||||||
|
class Fabric(models.Model):
|
||||||
|
NG_CHOICES = (
|
||||||
|
('Textured', (
|
||||||
|
('x', 'Horizontal'),
|
||||||
|
('y', 'Vertical'),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
('plain', 'Smooth'),
|
||||||
|
)
|
||||||
|
surface = models.CharField(max_length=20, choices=NG_CHOICES)
|
||||||
|
|
||||||
|
class FabricAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('surface',)
|
||||||
|
list_filter = ('surface',)
|
||||||
|
|
||||||
class Persona(models.Model):
|
class Persona(models.Model):
|
||||||
"""
|
"""
|
||||||
A simple persona associated with accounts, to test inlining of related
|
A simple persona associated with accounts, to test inlining of related
|
||||||
@ -208,6 +223,7 @@ admin.site.register(Thing, ThingAdmin)
|
|||||||
admin.site.register(Persona, PersonaAdmin)
|
admin.site.register(Persona, PersonaAdmin)
|
||||||
admin.site.register(Parent, ParentAdmin)
|
admin.site.register(Parent, ParentAdmin)
|
||||||
admin.site.register(EmptyModel, EmptyModelAdmin)
|
admin.site.register(EmptyModel, EmptyModelAdmin)
|
||||||
|
admin.site.register(Fabric, FabricAdmin)
|
||||||
|
|
||||||
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
|
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
|
||||||
# That way we cover all four cases:
|
# That way we cover all four cases:
|
||||||
|
@ -19,7 +19,7 @@ except NameError:
|
|||||||
from sets import Set as set
|
from sets import Set as set
|
||||||
|
|
||||||
class AdminViewBasicTest(TestCase):
|
class AdminViewBasicTest(TestCase):
|
||||||
fixtures = ['admin-views-users.xml', 'admin-views-colors.xml']
|
fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml']
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.client.login(username='super', password='secret')
|
self.client.login(username='super', password='secret')
|
||||||
@ -175,6 +175,37 @@ class AdminViewBasicTest(TestCase):
|
|||||||
response = self.client.get('/test_admin/admin/admin_views/thing/', {'color__id__exact': 'StringNotInteger!'})
|
response = self.client.get('/test_admin/admin/admin_views/thing/', {'color__id__exact': 'StringNotInteger!'})
|
||||||
self.assertRedirects(response, '/test_admin/admin/admin_views/thing/?e=1')
|
self.assertRedirects(response, '/test_admin/admin/admin_views/thing/?e=1')
|
||||||
|
|
||||||
|
def testNamedGroupFieldChoicesChangeList(self):
|
||||||
|
"""
|
||||||
|
Ensures the admin changelist shows correct values in the relevant column
|
||||||
|
for rows corresponding to instances of a model in which a named group
|
||||||
|
has been used in the choices option of a field.
|
||||||
|
"""
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/fabric/')
|
||||||
|
self.failUnlessEqual(response.status_code, 200)
|
||||||
|
self.failUnless(
|
||||||
|
'<a href="1/">Horizontal</a>' in response.content and
|
||||||
|
'<a href="2/">Vertical</a>' in response.content,
|
||||||
|
"Changelist table isn't showing the right human-readable values set by a model field 'choices' option named group."
|
||||||
|
)
|
||||||
|
|
||||||
|
def testNamedGroupFieldChoicesFilter(self):
|
||||||
|
"""
|
||||||
|
Ensures the filter UI shows correctly when at least one named group has
|
||||||
|
been used in the choices option of a model field.
|
||||||
|
"""
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/fabric/')
|
||||||
|
self.failUnlessEqual(response.status_code, 200)
|
||||||
|
self.failUnless(
|
||||||
|
'<div id="changelist-filter">' in response.content,
|
||||||
|
"Expected filter not found in changelist view."
|
||||||
|
)
|
||||||
|
self.failUnless(
|
||||||
|
'<a href="?surface__exact=x">Horizontal</a>' in response.content and
|
||||||
|
'<a href="?surface__exact=y">Vertical</a>' in response.content,
|
||||||
|
"Changelist filter isn't showing options contained inside a model field 'choices' option named group."
|
||||||
|
)
|
||||||
|
|
||||||
def get_perm(Model, perm):
|
def get_perm(Model, perm):
|
||||||
"""Return the permission object, for the Model"""
|
"""Return the permission object, for the Model"""
|
||||||
ct = ContentType.objects.get_for_model(Model)
|
ct = ContentType.objects.get_for_model(Model)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user