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.
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')
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)
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