私のサイトでは、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のメールアドレスを持つ管理ビューを作成しようとしています。
ユーザーのメールを表示するには、メールを返す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
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)
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