mirror of
https://github.com/django/django.git
synced 2025-08-23 10:19:13 +00:00
[1.8.x] Fixed #24851 -- Fixed crash with reverse one-to-one relation in ModelAdmin.list_display
This commit is contained in:
parent
f65d4db8a8
commit
2456276b02
@ -200,7 +200,7 @@ def items_for_result(cl, result, form):
|
|||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
result_repr = EMPTY_CHANGELIST_VALUE
|
result_repr = EMPTY_CHANGELIST_VALUE
|
||||||
else:
|
else:
|
||||||
if f is None:
|
if f is None or f.auto_created:
|
||||||
if field_name == 'action_checkbox':
|
if field_name == 'action_checkbox':
|
||||||
row_classes = ['action-checkbox']
|
row_classes = ['action-checkbox']
|
||||||
allow_tags = getattr(attr, 'allow_tags', False)
|
allow_tags = getattr(attr, 'allow_tags', False)
|
||||||
|
@ -383,7 +383,7 @@ class ChangeList(object):
|
|||||||
except FieldDoesNotExist:
|
except FieldDoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if isinstance(field.rel, models.ManyToOneRel):
|
if hasattr(field, 'rel') and isinstance(field.rel, models.ManyToOneRel):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -28,3 +28,6 @@ Bugfixes
|
|||||||
|
|
||||||
* Prevented the loss of ``null``/``not null`` column properties during field
|
* Prevented the loss of ``null``/``not null`` column properties during field
|
||||||
renaming of MySQL databases (:ticket:`24817`).
|
renaming of MySQL databases (:ticket:`24817`).
|
||||||
|
|
||||||
|
* Fixed a crash when using a reverse one-to-one relation in
|
||||||
|
``ModelAdmin.list_display`` (:ticket:`24851`).
|
||||||
|
@ -102,7 +102,7 @@ site.register(Parent, NoListDisplayLinksParentAdmin)
|
|||||||
|
|
||||||
class SwallowAdmin(admin.ModelAdmin):
|
class SwallowAdmin(admin.ModelAdmin):
|
||||||
actions = None # prevent ['action_checkbox'] + list(list_display)
|
actions = None # prevent ['action_checkbox'] + list(list_display)
|
||||||
list_display = ('origin', 'load', 'speed')
|
list_display = ('origin', 'load', 'speed', 'swallowonetoone')
|
||||||
|
|
||||||
site.register(Swallow, SwallowAdmin)
|
site.register(Swallow, SwallowAdmin)
|
||||||
|
|
||||||
|
@ -78,6 +78,10 @@ class Swallow(models.Model):
|
|||||||
ordering = ('speed', 'load')
|
ordering = ('speed', 'load')
|
||||||
|
|
||||||
|
|
||||||
|
class SwallowOneToOne(models.Model):
|
||||||
|
swallow = models.OneToOneField(Swallow)
|
||||||
|
|
||||||
|
|
||||||
class UnorderedObject(models.Model):
|
class UnorderedObject(models.Model):
|
||||||
"""
|
"""
|
||||||
Model without any defined `Meta.ordering`.
|
Model without any defined `Meta.ordering`.
|
||||||
|
@ -25,7 +25,7 @@ from .admin import (
|
|||||||
from .models import (
|
from .models import (
|
||||||
Band, Child, ChordsBand, ChordsMusician, CustomIdUser, Event, Genre, Group,
|
Band, Child, ChordsBand, ChordsMusician, CustomIdUser, Event, Genre, Group,
|
||||||
Invitation, Membership, Musician, OrderedObject, Parent, Quartet, Swallow,
|
Invitation, Membership, Musician, OrderedObject, Parent, Quartet, Swallow,
|
||||||
UnorderedObject,
|
SwallowOneToOne, UnorderedObject,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -478,8 +478,10 @@ class ChangeListTests(TestCase):
|
|||||||
Regression test for #17128
|
Regression test for #17128
|
||||||
(ChangeList failing under Python 2.5 after r16319)
|
(ChangeList failing under Python 2.5 after r16319)
|
||||||
"""
|
"""
|
||||||
swallow = Swallow.objects.create(
|
swallow = Swallow.objects.create(origin='Africa', load='12.34', speed='22.2')
|
||||||
origin='Africa', load='12.34', speed='22.2')
|
swallow2 = Swallow.objects.create(origin='Africa', load='12.34', speed='22.2')
|
||||||
|
swallow_o2o = SwallowOneToOne.objects.create(swallow=swallow2)
|
||||||
|
|
||||||
model_admin = SwallowAdmin(Swallow, admin.site)
|
model_admin = SwallowAdmin(Swallow, admin.site)
|
||||||
superuser = self._create_superuser('superuser')
|
superuser = self._create_superuser('superuser')
|
||||||
request = self._mocked_authenticated_request('/swallow/', superuser)
|
request = self._mocked_authenticated_request('/swallow/', superuser)
|
||||||
@ -488,6 +490,9 @@ class ChangeListTests(TestCase):
|
|||||||
self.assertContains(response, six.text_type(swallow.origin))
|
self.assertContains(response, six.text_type(swallow.origin))
|
||||||
self.assertContains(response, six.text_type(swallow.load))
|
self.assertContains(response, six.text_type(swallow.load))
|
||||||
self.assertContains(response, six.text_type(swallow.speed))
|
self.assertContains(response, six.text_type(swallow.speed))
|
||||||
|
# Reverse one-to-one relations should work.
|
||||||
|
self.assertContains(response, '<td class="field-swallowonetoone">(None)</td>')
|
||||||
|
self.assertContains(response, '<td class="field-swallowonetoone">%s</td>' % swallow_o2o)
|
||||||
|
|
||||||
def test_deterministic_order_for_unordered_model(self):
|
def test_deterministic_order_for_unordered_model(self):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user