Fixed #29428 -- Fixed admin changelist crash when using a query expression without asc()/desc() in the ordering.
This commit is contained in:
parent
a77f21880d
commit
0d8e3e608e
|
@ -17,7 +17,7 @@ from django.core.exceptions import (
|
||||||
)
|
)
|
||||||
from django.core.paginator import InvalidPage
|
from django.core.paginator import InvalidPage
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.expressions import F, OrderBy
|
from django.db.models.expressions import Combinable, F, OrderBy
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.http import urlencode
|
from django.utils.http import urlencode
|
||||||
from django.utils.timezone import make_aware
|
from django.utils.timezone import make_aware
|
||||||
|
@ -326,7 +326,9 @@ class ChangeList:
|
||||||
# the right column numbers absolutely, because there might be more
|
# the right column numbers absolutely, because there might be more
|
||||||
# than one column associated with that ordering, so we guess.
|
# than one column associated with that ordering, so we guess.
|
||||||
for field in ordering:
|
for field in ordering:
|
||||||
if isinstance(field, OrderBy):
|
if isinstance(field, (Combinable, OrderBy)):
|
||||||
|
if not isinstance(field, OrderBy):
|
||||||
|
field = field.asc()
|
||||||
if isinstance(field.expression, F):
|
if isinstance(field.expression, F):
|
||||||
order_type = 'desc' if field.descending else 'asc'
|
order_type = 'desc' if field.descending else 'asc'
|
||||||
field = field.expression.name
|
field = field.expression.name
|
||||||
|
|
|
@ -9,4 +9,5 @@ Django 2.0.7 fixes several bugs in 2.0.6.
|
||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
* ...
|
* Fixed admin changelist crash when using a query expression without ``asc()``
|
||||||
|
or ``desc()`` in the page's ordering (:ticket:`29428`).
|
||||||
|
|
|
@ -77,6 +77,17 @@ class ChangeListTests(TestCase):
|
||||||
cl = m.get_changelist_instance(request)
|
cl = m.get_changelist_instance(request)
|
||||||
self.assertEqual(cl.get_ordering_field_columns(), {3: 'desc', 2: 'asc'})
|
self.assertEqual(cl.get_ordering_field_columns(), {3: 'desc', 2: 'asc'})
|
||||||
|
|
||||||
|
def test_specified_ordering_by_f_expression_without_asc_desc(self):
|
||||||
|
class OrderedByFBandAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ['name', 'genres', 'nr_of_members']
|
||||||
|
ordering = (F('nr_of_members'), Upper('name'), F('genres'))
|
||||||
|
|
||||||
|
m = OrderedByFBandAdmin(Band, custom_site)
|
||||||
|
request = self.factory.get('/band/')
|
||||||
|
request.user = self.superuser
|
||||||
|
cl = m.get_changelist_instance(request)
|
||||||
|
self.assertEqual(cl.get_ordering_field_columns(), {3: 'asc', 2: 'asc'})
|
||||||
|
|
||||||
def test_select_related_preserved(self):
|
def test_select_related_preserved(self):
|
||||||
"""
|
"""
|
||||||
Regression test for #10348: ChangeList.get_queryset() shouldn't
|
Regression test for #10348: ChangeList.get_queryset() shouldn't
|
||||||
|
|
Loading…
Reference in New Issue