mirror of
https://github.com/django/django.git
synced 2025-11-18 11:00:24 +00:00
Fix inability to override get_FIELD_display methods
Ensure custom get_FIELD_display() overrides are respected for model fields with choices. This restores behavior present before Django 2.2. Fixes # (referenced issue in description).
This commit is contained in:
parent
8463390527
commit
f23bce7ebf
3 changed files with 24 additions and 4 deletions
|
|
@ -763,8 +763,10 @@ class Field(RegisterLookupMixin):
|
||||||
if not getattr(cls, self.attname, None):
|
if not getattr(cls, self.attname, None):
|
||||||
setattr(cls, self.attname, self.descriptor_class(self))
|
setattr(cls, self.attname, self.descriptor_class(self))
|
||||||
if self.choices is not None:
|
if self.choices is not None:
|
||||||
setattr(cls, 'get_%s_display' % self.name,
|
# Check that a get_FIELD_display method hasn't been manually defined.
|
||||||
partialmethod(cls._get_FIELD_display, field=self))
|
if not hasattr(cls, 'get_%s_display' % self.name):
|
||||||
|
setattr(cls, 'get_%s_display' % self.name,
|
||||||
|
partialmethod(cls._get_FIELD_display, field=self))
|
||||||
|
|
||||||
def get_filter_kwargs_for_object(self, obj):
|
def get_filter_kwargs_for_object(self, obj):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -405,3 +405,11 @@ class UUIDChild(PrimaryKeyUUIDModel):
|
||||||
|
|
||||||
class UUIDGrandchild(UUIDChild):
|
class UUIDGrandchild(UUIDChild):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class CustomGetDisplayModel(models.Model):
|
||||||
|
"""Test model for overriding get_FIELD_display()."""
|
||||||
|
foo_bar = models.CharField(max_length=10, choices=[(1, 'foo'), (2, 'bar')])
|
||||||
|
|
||||||
|
def get_foo_bar_display(self):
|
||||||
|
return "something"
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ from django.test import SimpleTestCase, TestCase
|
||||||
from django.utils.functional import lazy
|
from django.utils.functional import lazy
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
Bar, Choiceful, Foo, RenamedField, VerboseNameField, Whiz, WhizDelayed,
|
Bar, Choiceful, CustomGetDisplayModel, Foo, RenamedField, VerboseNameField,
|
||||||
WhizIter, WhizIterEmpty,
|
Whiz, WhizDelayed, WhizIter, WhizIterEmpty,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -186,6 +186,16 @@ class GetFieldDisplayTests(SimpleTestCase):
|
||||||
self.assertIsNone(WhizIterEmpty(c=None).c) # Blank value
|
self.assertIsNone(WhizIterEmpty(c=None).c) # Blank value
|
||||||
self.assertEqual(WhizIterEmpty(c='').c, '') # Empty value
|
self.assertEqual(WhizIterEmpty(c='').c, '') # Empty value
|
||||||
|
|
||||||
|
def test_overriding_get_FIELD_display(self):
|
||||||
|
"""
|
||||||
|
Can override the get_FIELD_display() method.
|
||||||
|
"""
|
||||||
|
obj = CustomGetDisplayModel(foo_bar=1)
|
||||||
|
# Should use the overridden method which always returns "something"
|
||||||
|
self.assertEqual(obj.get_foo_bar_display(), 'something')
|
||||||
|
obj.foo_bar = 2
|
||||||
|
self.assertEqual(obj.get_foo_bar_display(), 'something')
|
||||||
|
|
||||||
|
|
||||||
class GetChoicesTests(SimpleTestCase):
|
class GetChoicesTests(SimpleTestCase):
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue