Normally non-fields cannot be sorted. This can be changed by setting
`admin_order_field`. This doesn't work on properties, while it is possible
to do so with `short_description`.
The
[[https://github.com/django/django/blob/e4df8e6dc021fa472fa77f9b835db74810184748/django/contrib/admin/utils.py#L345|code]]
that checks for `short_description` checks if it handles a property and
returns `attr.fget.short_description` if available.
The files that check for `admin_order_field` do not handle the case that
it might be a property.
The relevant files are probably:
- django/contrib/admin/views/main.py
([[https://github.com/django/django/blob/24b82cd201e21060fbc02117dc16d1702877a1f3/django/contrib/admin/views/main.py|GitHub]])
- django/contrib/admin/templatetags/admin_list.py
([[https://github.com/django/django/blob/0004daa536890fdb389c895baaa21bea6a1f7073/django/contrib/admin/templatetags/admin_list.py|
GitHub]])
--
Ticket URL: <https://code.djangoproject.com/ticket/30259>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* status: new => assigned
* owner: nobody => Jani Tiainen
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:1>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/11096 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:2>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:3>
* version: 2.1 => master
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:4>
* type: Bug => New feature
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:5>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"044cc544203fdcf2601ff200547ecae2e51a5db5" 044cc544]:
{{{
#!CommitTicketReference repository=""
revision="044cc544203fdcf2601ff200547ecae2e51a5db5"
Fixed #30259 -- Added support for admin_order_field attribute on
properties in ModelAdmin.list_display.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:6>
* status: closed => new
* severity: Normal => Release blocker
* easy: 1 => 0
* has_patch: 1 => 0
* resolution: fixed =>
* stage: Ready for checkin => Accepted
Comment:
A selenium test fails after the patch:
`admin_views.tests.SeleniumTests.test_list_editable_raw_id_fields`:
{{{
Traceback (most recent call last):
File "/home/tim/code/django/django/core/handlers/exception.py", line 34,
in inner
response = get_response(request)
File "/home/tim/code/django/django/core/handlers/base.py", line 145, in
_get_response
response = self.process_exception_by_middleware(e, request)
File "/home/tim/code/django/django/core/handlers/base.py", line 143, in
_get_response
response = response.render()
File "/home/tim/code/django/django/template/response.py", line 106, in
render
self.content = self.rendered_content
File "/home/tim/code/django/django/template/response.py", line 83, in
rendered_content
content = template.render(context, self._request)
File "/home/tim/code/django/django/template/backends/django.py", line
61, in render
return self.template.render(context)
File "/home/tim/code/django/django/template/base.py", line 171, in
render
return self._render(context)
File "/home/tim/code/django/django/test/utils.py", line 95, in
instrumented_test_render
return self.nodelist.render(context)
File "/home/tim/code/django/django/template/base.py", line 937, in
render
bit = node.render_annotated(context)
File "/home/tim/code/django/django/template/base.py", line 904, in
render_annotated
return self.render(context)
File "/home/tim/code/django/django/template/loader_tags.py", line 150,
in render
return compiled_parent._render(context)
File "/home/tim/code/django/django/test/utils.py", line 95, in
instrumented_test_render
return self.nodelist.render(context)
File "/home/tim/code/django/django/template/base.py", line 937, in
render
bit = node.render_annotated(context)
File "/home/tim/code/django/django/template/base.py", line 904, in
render_annotated
return self.render(context)
File "/home/tim/code/django/django/template/loader_tags.py", line 150,
in render
return compiled_parent._render(context)
File "/home/tim/code/django/django/test/utils.py", line 95, in
instrumented_test_render
return self.nodelist.render(context)
File "/home/tim/code/django/django/template/base.py", line 937, in
render
bit = node.render_annotated(context)
File "/home/tim/code/django/django/template/base.py", line 904, in
render_annotated
return self.render(context)
File "/home/tim/code/django/django/template/loader_tags.py", line 62, in
render
result = block.nodelist.render(context)
File "/home/tim/code/django/django/template/base.py", line 937, in
render
bit = node.render_annotated(context)
File "/home/tim/code/django/django/template/base.py", line 904, in
render_annotated
return self.render(context)
File "/home/tim/code/django/django/template/loader_tags.py", line 62, in
render
result = block.nodelist.render(context)
File "/home/tim/code/django/django/template/base.py", line 937, in
render
bit = node.render_annotated(context)
File "/home/tim/code/django/django/template/base.py", line 904, in
render_annotated
return self.render(context)
File "/home/tim/code/django/django/contrib/admin/templatetags/base.py",
line 33, in render
return super().render(context)
File "/home/tim/code/django/django/template/library.py", line 214, in
render
_dict = self.func(*resolved_args, **resolved_kwargs)
File
"/home/tim/code/django/django/contrib/admin/templatetags/admin_list.py",
line 332, in result_list
headers = list(result_headers(cl))
File
"/home/tim/code/django/django/contrib/admin/templatetags/admin_list.py",
line 133, in result_headers
admin_order_field = getattr(attr.fget, 'admin_order_field')
AttributeError: 'function' object has no attribute 'admin_order_field'
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:7>
Comment (by Jani Tiainen):
Replying to [comment:7 Tim Graham]:
> A selenium test fails after the patch:
`admin_views.tests.SeleniumTests.test_list_editable_raw_id_fields`:
> {{{
> File
"/home/tim/code/django/django/contrib/admin/templatetags/admin_list.py",
line 133, in result_headers
> admin_order_field = getattr(attr.fget, 'admin_order_field')
> AttributeError: 'function' object has no attribute 'admin_order_field'
> }}}
Apparently that `getattr` should be:
{{{
admin_order_field = getattr(attr.fget, 'admin_order_field', None)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:8>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/11154 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:9>
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"7cbcf2e2cbca1acfccfd973f746a9e6abfc0052e" 7cbcf2e2]:
{{{
#!CommitTicketReference repository=""
revision="7cbcf2e2cbca1acfccfd973f746a9e6abfc0052e"
Fixed #30259 -- Fixed crash of admin views when properties don't have
admin_order_field attribute.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30259#comment:10>