2010-08-03 5 views
19

Si vous souhaitez stocker des informations supplémentaires sur un utilisateur (django.contrib.auth.models.User) dans Django, vous pouvez utiliser l'astucieux AUTH_PROFILE_MODULE pour brancher un modèle "profile". Chaque utilisateur obtient ensuite un profil. Tout cela est décrit ici:Comment modifier en ligne un profil utilisateur django dans l'interface d'administration?

Maintenant, disons que j'ai créé une application appelée comptes avec un modèle appelé UserProfile et enregistré comme modèle de profil pour mes utilisateurs. Comment intégrer la modification du profil dans l'interface d'administration pour éditer les utilisateurs (ou vice versa)?

Répondre

13

Eh bien, il s'avère que c'est assez facile, une fois que vous savez comment le faire. Ceci est mon myapp/comptes/admin.py:

from django.contrib import admin 
from myapp.accounts.models import UserProfile 
from django.contrib.auth.models import User 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 

class AccountsUserAdmin(admin.UserAdmin): 
    inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin that includes a UserProfile 
admin.site.register(User, AccountsUserAdmin) 

La valeur par défaut admin.UserAdmin classe ModelAdmin pour les utilisateurs est non enregistrée et une nouvelle spécification d'une ligne UserProfile est enregistré à sa place. Je pensais juste que je devais partager.

+1

Comment gérez-vous le lien du formulaire de mot de passe? Juste ces changements le cassent puisqu'il était seulement destiné à être vu du formulaire de changement après qu'un utilisateur avec un nom et un mot de passe a été ajouté. – JivanAmara

+2

Ce qui précède est presque correct, la manière correcte qui fait également le 'lien de forme de mot de passe' est d'étendre la coutume 'UserAdmin' par opposition à' admin.ModelAdmin' - essayez: 'from django.contrib.auth.admin import UserAdmin' puis 'class UserProfileAdmin (UserAdmin):' –

+0

Il est assez vieux et peut-être obsolète. Merci pour l'édition! –

29

Je propse une version légèrement améliorée de la solution d'André car il brise la vue de la liste dans/admin/auth/user /:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

class UserProfileInline(admin.StackedInline): 
model = UserProfile 
max_num = 1 
can_delete = False 

class UserAdmin(AuthUserAdmin): 
inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 
+1

Des idées sur la façon de déplacer le 'UserProfileInline' vers le haut:? –

+0

Cette fonctionnalité a été demandée plusieurs fois, https://code.djangoproject.com/ticket/4848 est la plus ancienne. Ce n'est pas encore implémenté. –

+0

Merci beaucoup! –

15

Je propose une autre amélioration à la solution de Robert:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 

class UserAdmin(AuthUserAdmin): 
    def add_view(self, *args, **kwargs): 
     self.inlines = [] 
     return super(UserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
     self.inlines = [UserProfileInline] 
     return super(UserAdmin, self).change_view(*args, **kwargs) 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 

Sans cette modification de UserAdmin, la section personnalisée UserProfileInline apparaîtra sur l'écran "Ajouter un utilisateur", qui est supposé demander le nom d'utilisateur et le mot de passe. Et si vous modifiez l'une des données de profil sur cet écran (loin des valeurs par défaut) avant d'enregistrer, vous obtiendrez une erreur de base de données "duplicate key".

+0

Complètement résolu mon problème ici: http://stackoverflow.com/questions/20214362/post-save-user-signal-that-creates-user-profile-is-being-called-twice-causing-du Merci! On pourrait penser que cette configuration d'utilisateur User/UserProfile ferait partie de la documentation de django. – chewynougat

+0

Merci beaucoup! Enfin, je reçois ceci pour se comporter comme il se doit haha –

0

Vous devez prendre en compte le formulaire d'ajout et de modification. Autrement, vous obtiendrez un utilisateur ne peut pas être aucune erreur lors de la création d'un utilisateur. Ce qui suit a été testé et fonctionne en 1.3:

class TeamInline(admin.StackedInline): 
    model = Team 
    fk_name = 'user' 
    max_num = 1 
    can_delete = False 

class TeamUserAdmin(UserAdmin): 
    list_display = ('username', 'email', 'company', 'expertise', 'contact_email', 'contact_phone', 'twitter', 'facebook', 'last_login_short', 'options') 
    list_select_related = True 

    def add_view(self, *args, **kwargs): 
    self.inline_instances = [] 
    return super(TeamUserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
    self.inline_instances.append(TeamInline(self.model, self.admin_site)) 
    return super(TeamUserAdmin, self).change_view(*args, **kwargs) 
Questions connexes