4

因此,查询集中的额外字段可用于向您的选择查询添加其他列,而这些列又可以设置为默认排序。到目前为止,我已经能够做到这一点:创建了一个额外的字段,然后将其设置为默认排序。

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

现在,在我的管理界面中,我有其他字段{name, nat, location, space, ....},并且表格中的结果按natname页面加载时排序......完美。

但现在我希望在name现场启用排序,但不是nameorder by ,而是我希望它按natname. 这可能吗?

因此,即使是一个额外的字段,我也想在订购时以natname某种方式绑定列。namenatname

现在,如果我这样做qs.query.__str__(),我会得到 sql 查询order by natname。当我单击列name时, order by 更改为name,但仅对于这种特殊情况,我希望它按natname. 这可能吗?

我已经查看了 Django 如何为这些自动管理页面生成标题和视图,<django-installation-path>/contrib/admin但它只引用了在此模型list_display中定义的集合。ModelAdmin如果我在那里进行任何更改,显示的列会在管理视图中更改。

听起来可能有点混乱。如果您需要特定的详细信息,请随时询问。

谢谢。

4

1 回答 1

6

是的!这是可能的(至少在 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)
于 2011-02-03T20:48:01.393 回答