15

auth.Userモデルの管理ページを再定義しようとしています。1つを除いて、すべてが正常に機能しています。以下のコードを確認してください。

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)

ご覧のとおり、モデルページのリストに表示したいフィールドの1つ(で定義list_display)はget_full_nameです。問題は、管理者の列ラベルがGetfullnameとして表示されることです

私の質問は単純です:これをオーバーライドできますか?もしそうなら、どのように?

ご協力いただきありがとうございます。

4

1 に答える 1

50

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' 

または、管理者固有のコードでモデルを汚染したくない場合は、インスタンスという1つの引数を取る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メソッドデコレータを作成しました。これは、非常にわかりやすい詳細なメソッド名を使い始めると、関数の属性の設定が非常に反復的で雑然としたものになるためです。

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>'''
于 2012-08-21T03:56:18.043 に答える