Fixed #30259 -- Added support for admin_order_field attribute on properties in ModelAdmin.list_display.
This commit is contained in:
parent
ea60b7bc74
commit
044cc54420
|
@ -128,6 +128,9 @@ def result_headers(cl):
|
|||
continue
|
||||
|
||||
admin_order_field = getattr(attr, "admin_order_field", None)
|
||||
# Set ordering for attr that is a property, if defined.
|
||||
if isinstance(attr, property) and hasattr(attr, 'fget'):
|
||||
admin_order_field = getattr(attr.fget, 'admin_order_field')
|
||||
if not admin_order_field:
|
||||
is_field_sortable = False
|
||||
|
||||
|
|
|
@ -264,6 +264,8 @@ class ChangeList:
|
|||
attr = getattr(self.model_admin, field_name)
|
||||
else:
|
||||
attr = getattr(self.model, field_name)
|
||||
if isinstance(attr, property) and hasattr(attr, 'fget'):
|
||||
attr = attr.fget
|
||||
return getattr(attr, 'admin_order_field', None)
|
||||
|
||||
def get_ordering(self, request, queryset):
|
||||
|
|
|
@ -754,8 +754,9 @@ subclass::
|
|||
|
||||
* Elements of ``list_display`` can also be properties. Please note however,
|
||||
that due to the way properties work in Python, setting
|
||||
``short_description`` on a property is only possible when using the
|
||||
``property()`` function and **not** with the ``@property`` decorator.
|
||||
``short_description`` or ``admin_order_field`` on a property is only
|
||||
possible when using the ``property()`` function and **not** with the
|
||||
``@property`` decorator.
|
||||
|
||||
For example::
|
||||
|
||||
|
@ -766,6 +767,7 @@ subclass::
|
|||
def my_property(self):
|
||||
return self.first_name + ' ' + self.last_name
|
||||
my_property.short_description = "Full name of the person"
|
||||
my_property.admin_order_field = 'last_name'
|
||||
|
||||
full_name = property(my_property)
|
||||
|
||||
|
|
|
@ -44,7 +44,8 @@ Minor features
|
|||
:mod:`django.contrib.admin`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ...
|
||||
* Added support for ``admin_order_field`` attribute on properties in
|
||||
:attr:`.ModelAdmin.list_display`.
|
||||
|
||||
:mod:`django.contrib.admindocs`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
@ -104,7 +104,7 @@ class ArticleAdmin(admin.ModelAdmin):
|
|||
list_display = (
|
||||
'content', 'date', callable_year, 'model_year', 'modeladmin_year',
|
||||
'model_year_reversed', 'section', lambda obj: obj.title,
|
||||
'order_by_expression',
|
||||
'order_by_expression', 'model_property_year',
|
||||
)
|
||||
list_editable = ('section',)
|
||||
list_filter = ('date', 'section')
|
||||
|
|
|
@ -55,6 +55,11 @@ class Article(models.Model):
|
|||
model_year_reversed.admin_order_field = '-date'
|
||||
model_year_reversed.short_description = ''
|
||||
|
||||
def property_year(self):
|
||||
return self.date.year
|
||||
property_year.admin_order_field = 'date'
|
||||
model_property_year = property(property_year)
|
||||
|
||||
|
||||
class Book(models.Model):
|
||||
"""
|
||||
|
|
|
@ -344,6 +344,25 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
|
|||
"Results of sorting on callable are out of order."
|
||||
)
|
||||
|
||||
def test_change_list_sorting_property(self):
|
||||
"""
|
||||
Sort on a list_display field that is a property (column 10 is
|
||||
a property in Article model).
|
||||
"""
|
||||
response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': 10})
|
||||
self.assertContentBefore(
|
||||
response,
|
||||
'Oldest content',
|
||||
'Middle content',
|
||||
'Results of sorting on property are out of order.',
|
||||
)
|
||||
self.assertContentBefore(
|
||||
response,
|
||||
'Middle content',
|
||||
'Newest content',
|
||||
'Results of sorting on property are out of order.',
|
||||
)
|
||||
|
||||
def test_change_list_sorting_callable_query_expression(self):
|
||||
"""
|
||||
Query expressions may be used for admin_order_field. (column 9 is
|
||||
|
|
Loading…
Reference in New Issue