Django Admin: comment afficher les champs de deux modèles différents dans la même vue?

Mon site utilise le modèle User Authentication de Django et un modèle UserProfile personnalisé pour stocker des données supplémentaires (anniversaire,etc.). Existe-t-il un moyen de créer une vue dans Django admin qui tisse ensemble des champs à partir des modèles User et UserProfile?

Je soupçonne que cet extrait de code n'est même pas proche, mais peut-être que cela aidera à illustrer ce que j'essaie de faire:

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)

Message d'Erreur:

ImproperlyConfigured: UserProfileAdmin.list_display[2], 'L'utilisateur.email 'n'est pas un appelable ou un attribut de 'UserProfileAdmin' ou trouvé dans le modèle 'UserProfile'.

En fin de compte, j'essaie de créer une vue d'administration qui a le prénom et le nom de famille de UserProfile et l'email de L'utilisateur.

31
demandé sur Joe 2010-08-05 01:27:43

3 réponses

Pour afficher l'email de l'utilisateur, vous devez avoir une méthode sur UserProfile ou UserProfileAdmin qui renvoie le mail

Sur UserProfile

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

Ou sur UserProfileAdmin

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

Puis changez votre list_display en

list_display = ('name', 'gender', 'user_email')
38
répondu Ashok 2010-08-05 02:47:01

Vous pouvez essayer d'utiliser InlineModelAdmin pour afficher les formulaires User et UserPofile dans une vue admin.

Pour afficher les informations de profil utilisateur dans la liste des modifications, vous pouvez créer une nouvelle méthode qui délègue les valeurs de UserProfile au Modèle User.

Par exemple, cela devrait fonctionner plus ou moins:)

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)
14
répondu Davor Lucic 2011-05-19 10:10:10

En utilisant Ashoks top réponse j'ai fait un extrait qui simplifie ce processus pour un grand nombre de champs

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
répondu user1267757 2015-08-27 12:53:25