Meine Website verwendet das Benutzerauthentifizierungsmodell von Django und ein benutzerdefiniertes Benutzerprofilmodell, um einige zusätzliche Daten (Geburtstag usw.) zu speichern. Gibt es eine Möglichkeit, in Django Admin eine Ansicht zu erstellen, die Felder aus dem User- und UserProfile-Modell zusammenfügt?
Ich vermute, dass dieses Code-Snippet nicht einmal in der Nähe ist, aber vielleicht hilft es, zu veranschaulichen, was ich versuche:
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)
Fehlermeldung:
Falsch konfiguriert: UserProfileAdmin.list_display [2], 'User.email' ist kein aufrufbares oder ein Attribut von 'UserProfileAdmin' oder im Modell 'UserProfile' vorhanden.
Letztendlich versuche ich, eine Administratoransicht zu erstellen, die den Vor- und Nachnamen von UserProfile und die E-Mail-Adresse von User enthält.
um die E-Mail des Benutzers anzuzeigen, benötigen Sie eine Methode für UserProfile
oder UserProfileAdmin
, die die E-Mail zurückgibt
in UserProfile
def user_email(self):
return self.user.email
oder unter UserProfileAdmin
def user_email(self, instance):
return instance.user.email
Ändern Sie dann Ihren list_display
in
list_display = ('name', 'gender', 'user_email')
Zugehörige Dokumente: ModelAdmin.list_display
Sie können versuchen, InlineModelAdmin zu verwenden, um sowohl User- als auch UserPofile-Formulare in einer Administratoransicht anzuzeigen.
Um Benutzerprofilinformationen in der Änderungsliste anzuzeigen, können Sie eine neue Methode erstellen, die die Werte von UserProfile
an User
-Modell delegiert.
Zum Beispiel sollte das mehr oder weniger funktionieren :)
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)
Mit Ashoks Top-Antwort habe ich ein Snippet erstellt, das diesen Prozess für eine große Anzahl von Feldern vereinfacht
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