【问题标题】:order admin list by username按用户名订购管理员列表
【发布时间】:2017-07-14 13:31:59
【问题描述】:

我想按用户名排序用户列表。这不起作用。

from django.contrib.auth.models import User
class UserAdmin(admin.ModelAdmin):
    ordering = ['username']
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

代码正在执行,因为如果我删除 register 方法,它会引发错误。 我需要这样做,因为我有另一个管理员:

list_filter = [
        'user',
        'content_type',
        'action_flag'
    ]

这里的用户名没有被排序,所以搜索用户几乎是不可能的。

我正在使用 django 1.8

我的 ModelAdmin 是:

类 LogEntryAdmin(admin.ModelAdmin):

date_hierarchy = 'action_time'
search_fields = ['user__username']
readonly_fields = LogEntry._meta.get_all_field_names()
readonly_fields = [x for x in readonly_fields if x[-3:] == '_id' and x[:-3] not in readonly_fields]

list_filter = [
    'user',
    'content_type',
    'action_flag'
]


search_fields = [
    'object_repr',
    'change_message'
]


list_display = [
    'action_time',
    'user',
    'content_type',
    'object_link',
    'action_flag',
    'change_message',
]

def has_add_permission(self, request):
    return False

def has_change_permission(self, request, obj=None):
    return request.user.is_superuser and request.method != 'POST'

def has_delete_permission(self, request, obj=None):
    return False

def object_link(self, obj):
    if obj.action_flag == DELETION:
        link = escape(obj.object_repr) + u' (%s)' % obj.object_id
    else:
        ct = obj.content_type
        link = u'<a href="%s">%s</a>' % (
            reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=[obj.object_id]),
            escape(obj.object_repr),
        )
    return link
object_link.allow_tags = True
object_link.admin_order_field = 'object_repr'
object_link.short_description = u'object'

【问题讨论】:

  • 你能显示错误吗?有吗?或者可能是用于测试的数据?
  • 如果您是为了方便搜索而订购,为什么不使用search_fields 代替?
  • 您是否尝试根据用户的用户名过滤管理员中的模型?您在共享的代码中所做的是设置 User 模型的顺序 - 而不是您创建的模型(管理类对于每个模型都是独立的,它们之间不会进行排序)
  • 是的,它适用于 LogEntry 模型。我希望 list_filter 用户字段按用户名排序。
  • 你能分享一下你的ModelAdmin吗?

标签: django django-admin


【解决方案1】:

如果您想根据模型所具有的关系的值来订购模型,您可以通过 ModelAdmin 为该模型而不是相关模型执行此操作(如果模型具有三个关系都提供了排序,如何它订购那个物体?)。在你的情况下,这意味着在LogEntryAdmin 上订购,而不是UserAdmin - 即使你想通过username 订购。

class LogEntryAdmin(admin.ModelAdmin):

    # Like elsewhere in Django, we use __ to traverse relationships
    ordering = ['user__username']
    date_hierarchy = 'action_time'
    search_fields = ['user__username']
    readonly_fields = LogEntry._meta.get_all_field_names()
    readonly_fields = [x for x in readonly_fields if x[-3:] == '_id' and x[:-3] not in readonly_fields]

这意味着您不再需要以下内容(The default ordering on User for admin 无论如何都是用户名):

from django.contrib.auth.models import User
class UserAdmin(admin.ModelAdmin):
    ordering = ['username']
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2021-01-27
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多