web-dev-qa-db-ja.com

Django管理者:2つの異なるモデルのフィールドを同じビューに表示する方法は?

私のサイトでは、Djangoのユーザー認証ユーザーモデルとカスタムのUserProfileモデルを使用して、いくつかの追加データ(誕生日など)を保存しています。 Django adminに、UserモデルとUserProfileモデルの両方のフィールドを一緒に織り込むビューを作成する方法はありますか?

このコードスニペットは近いとは思えませんが、私が何をしようとしているのかを説明するのに役立つかもしれません。

from Django.contrib import admin
from Django.contrib.auth.models import User
from userprofile.models import UserProfile


class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('name', 'gender', 'User.email') #user.email creates the error - tried some variations here, but no luck.

admin.site.register(UserProfile, UserProfileAdmin)

エラーメッセージ:

ImproperlyConfigured:UserProfileAdmin.list_display [2]、 'User.email'は呼び出し可能ではないか、 'UserProfileAdmin'の属性ではないか、モデル 'UserProfile'で見つかりません。

最終的に、UserProfileの姓名とUserのメールアドレスを持つ管理ビューを作成しようとしています。

35
Joe

ユーザーのメールを表示するには、メールを返すUserProfileまたはUserProfileAdminのメソッドが必要です

userProfile

def user_email(self):
    return self.user.email

またはUserProfileAdmin

def user_email(self, instance):
    return instance.user.email

次にlist_displayから

list_display = ('name', 'gender', 'user_email')

関連ドキュメント: ModelAdmin.list_display

42
Ashok

InlineModelAdmin を使用して、UserフォームとUserPofileフォームの両方を管理ビューに表示することができます。

変更リストにユーザープロファイル情報を表示するには、UserProfileからUserモデルに値を委任する新しいメソッドを作成できます。

たとえば、これは多かれ少なかれ動作するはずです:)

from Django.contrib import admin
from Django.contrib.auth.models import User

from my_models import UserProfile

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    fk_name = 'user'

class UserAdmin(admin.ModelAdmin):
    list_display = ['get_userprofile_name', 'email']
    list_select_related = True
    inlines = [
        UserProfileInline,
    ]

    def get_userprofile_name(self, instance):
        # instance is User instance
        return instance.get_profile().name

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
16
Davor Lucic

Ashoksのトップアンサーを使用して、多数のフィールドでこのプロセスを簡略化するスニペットを作成しました

class ColumnViewer(object):
    pass

column_list = ('name', 'surname', )

for col in column_list:
    setattr(ColumnViewer, col, lambda s,i : getattr(i, col))

@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin, ColumnViewer):
    list_display = column_list
0
user1267757