如何在 Django Admin 中为作为方法//属性的字段重命名列标签?

Posted

技术标签:

【中文标题】如何在 Django Admin 中为作为方法//属性的字段重命名列标签?【英文标题】:How can I rename a column label in Django Admin for a field that is a method//property? 【发布时间】:2012-08-16 09:41:45 【问题描述】:

我正在尝试为 auth.User 模型重新定义我的管理页面。 一切正常,除了一件事。检查下面的代码:

from django.contrib import admin
from django.contrib.auth.models import User
from access.models import UserProfile


class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserAdmim(admin.ModelAdmin):
    inlines = [UserProfileInline,]
    list_display = ['id', 'username', 'get_full_name', 'email']


admin.site.unregister(User)
admin.site.register(User, UserAdmim)

如您所见,我希望在模型页面列表中显示的字段之一(由list_display 定义)是get_full_name。问题是admin中的列标签显示为Get full name

我的问题很简单:我可以覆盖它吗?如果有,怎么做?

感谢您的帮助。

【问题讨论】:

Django admin listview Customize Column Name 【参考方案1】:

在您的函数中将一个名为 short_description 的属性设置为模型定义中所需的标签。

# note, this must be done in the class definition;
# not User.get_full_name.short_description
get_full_name.short_description = 'my label' 

或者,如果您不想使用管理员特定代码污染您的模型,您可以将list_display 设置为ModelAdmin 上的一个方法,该方法采用一个参数:实例。您还必须设置 readonly_fields 以便管理员不会尝试在您的模型中查找此字段。我在管理字段前加上 _ 来区分。

class MyAdmin(...):
    list_display = ('_my_field',)
    readonly_fields = ('_my_field', )     

    def _my_field(self, obj):
        return obj.get_full_name()
    _my_field.short_description = 'my custom label'


更新:

请注意,这会破坏默认的管理员排序。您的管理员将不再通过单击标签对字段进行排序。要再次启用此功能,请定义 admin_order_field

def _date_created(self, obj):
    return obj.date_created.strftime('%m/%d/%Y')
_date_created.short_description = "Date Created"
_date_created.admin_order_field = 'date_created'

更新 2:

我写了一个 admin method decorator 来简化这个过程,因为一旦我开始使用描述性很强的冗长方法名称,在函数上设置属性就会变得非常重复和混乱。

def admin_method_attributes(**outer_kwargs):
    """ Wrap an admin method with passed arguments as attributes and values.
    DRY way of extremely common admin manipulation such as setting short_description, allow_tags, etc.
    """
    def method_decorator(func):
        for kw, arg in outer_kwargs.items():
            setattr(func, kw, arg)
        return func
    return method_decorator


# usage
class ModelAdmin(admin.ModelAdmin):
    @admin_method_attributes(short_description='Some Short Description', allow_tags=True)
    def my_admin_method(self, obj):
        return '''<em>obj.id</em>'''

【讨论】:

在 auth.User 模型的情况下定义 short_description 属性不起作用。您能否验证并编辑您的答案?我收到以下错误:`/admin/auth/user/'instancemethod' 对象的 AttributeError 没有属性 'short_description'。这就是我需要检查的正确答案=) @Francisco,请参阅我提到的“在您的模型定义中”-在您的 auth.User 情况下,您必须进入 django 源代码。由于这不是一个真正的选择,请参阅我的回答的第二部分_my_field Django 3.2,而不是allow_tags,你应该使用:format_html

以上是关于如何在 Django Admin 中为作为方法//属性的字段重命名列标签?的主要内容,如果未能解决你的问题,请参考以下文章

Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

如何在 django 中为 sorl-thumbnail 设计清理任务?

在Django Admin中为选项添加额外数据

在 django admin 中为内联项目添加完整更改表单的链接?

django admin中的表单字段描述

Django Admin - 允许为 is_staff 用户显示模型