Как переименовать метку столбца в Django Admin для поля, которое является свойством метода//?

Я пытаюсь переопределить мою страницу администратора 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 -- is get_full_name. Проблема в том, что метка столбца в admin отображается как узнать ФИО.

мой вопрос прост: могу ли я переопределить это? Если да, то как?

спасибо ваша помощь.

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 чтобы администратор не пытался найти это поле в вашей модели. Я префикс admin поля с _ в дифференцировать.

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 метод декоратора это упрощает этот процесс, потому что как только я начал использовать высоко описательные подробные имена методов, установка атрибутов на функцию стала массово повторяющейся и беспорядочной.

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>'''