web-dev-qa-db-de.com

Django Admin: Wie werden Felder von zwei verschiedenen Modellen in unterschiedlicher Ansicht angezeigt?

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.

32
Joe

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

38
Ashok

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)
15
Davor Lucic

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
0
user1267757