Страницы администратора Django: можно ли использовать дополнительные поля набора запросов для сортировки определенных столбцов - PullRequest
4 голосов
/ 03 февраля 2011

Таким образом, дополнительное поле в наборе запросов можно использовать для добавления дополнительных столбцов к вашему запросу select, которые, в свою очередь, могут быть установлены в качестве порядка по умолчанию. Я до сих пор был в состоянии достичь этого: создал дополнительное поле и затем установить его в качестве порядка по умолчанию.

qs = qs.extra(select={'natname':"concat('0', nat, name)"}, order_by=['natname'])

Теперь в моем интерфейсе администратора у меня есть другие мои поля {name, nat, location, space, ....}, и результаты из таблицы упорядочиваются по natname, когда страница загружена ... идеально.

Но теперь я хочу включить упорядочение в поле name, но вместо упорядочения по name я хочу упорядочить его по natname. Это возможно?

Так что, хотя natname является дополнительным полем, я хочу каким-то образом связать столбец name с natname, когда дело доходит до упорядочения.

Прямо сейчас, если я сделаю qs.query.__str__(), я получу запрос sql с order by natname. Когда я нажимаю на столбец name, упорядочить по изменению на name, но только для этого особого случая я хочу, чтобы он заказал по natname. Это возможно?

Я посмотрел, как Django генерирует заголовки и представления для этих автоматизированных административных страниц в <django-installation-path>/contrib/admin, но он ссылается только на набор list_display, определенный в ModelAdmin для этой модели. Если я внесу какие-либо изменения, отображаемые столбцы изменятся в представлении администратора.

Это может звучать немного странно. Если вам нужны конкретные детали, пожалуйста, не стесняйтесь спрашивать.

Спасибо.

1 Ответ

6 голосов
/ 03 февраля 2011

Да! это возможно (по крайней мере, в Django 1.2.3):

В вашем подклассе admin.ModelAdmin:

from django.contrib import admin

from .models import ClassA

class ModelAdminA(admin.ModelAdmin):
    list_display = ('natname',)

    def natname(self, obj):
        return obj.name
    natname.admin_order_field = 'natname'
    natname.short_description = 'name'

    def queryset(self, request):
        qs = super(ModelAdminA, self).queryset(request)
        qs = qs.extra(select={ 'natname': "concat('0', nat, name)" })
        return qs

admin.site.register(ClassA, ModelAdminA)
...