2010-08-03 13 views
19

Si desea almacenar información adicional acerca de un usuario (django.contrib.auth.models.User) en Django, puede usar el ingenioso AUTH_PROFILE_MODULE para conectar un modelo de "perfil". Cada usuario luego obtiene un perfil. Todo se describe aquí:¿Cómo edito en línea un perfil de usuario django en la interfaz de administración?

Ahora, digamos que he creado una aplicación llamada cuentas con un modelo llamado PerfilUsuario y registrado como el modelo de perfil para mis usuarios. ¿Cómo puedo alinear la edición del perfil en la interfaz de administración para editar usuarios (o viceversa)?

Respuesta

13

Bueno, resulta que esto es bastante fácil, una vez que sabes cómo hacerlo. Este es mi miaplicacion/cuentas/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 clase por defecto ModelAdmin admin.UserAdmin para los usuarios es no registrado y una nueva especificación de una línea UserProfile que está inscrita en su lugar. Solo pensé que debería compartir.

+1

¿Cómo maneja el enlace del formulario de contraseña? Solo estos cambios lo rompen, ya que solo debía verse en el formulario de cambio después de agregar un usuario con un nombre y una contraseña. – JivanAmara

+2

Lo anterior es casi correcto, la forma correcta en que también funciona el 'enlace de formulario de contraseña' es extender el 'UserAdmin' personalizado en lugar de' admin.ModelAdmin' - try: 'from django.contrib.auth.admin import UserAdmin' entonces 'clase UserProfileAdmin (UserAdmin):' –

+0

Es bastante viejo y quizás anticuado. Gracias por la edición! –

29

I propse una versión ligeramente mejorada de la solución de André, ya que rompe la vista de lista en/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

Cualquier idea de cómo mover 'UserProfileInline' a la cima:? –

+0

Esta función ha sido solicitada varias veces, https://code.djangoproject.com/ticket/4848 es la más antigua. Aún no está implementado. –

+0

¡Muchas gracias! –

15

propongo otra mejora a la solución 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) 

Sin este cambio en UserAdmin, la sección personalizada UserProfileInline aparecerá en la pantalla "agregar usuario", que se supone que debe solicitar el nombre de usuario y la contraseña. Y si cambia alguno de los datos de perfil en esa pantalla (lejos de los valores predeterminados) antes de guardar, obtendrá un error de base de datos de "clave duplicada".

+0

Resolvió completamente mi problema aquí: http://stackoverflow.com/questions/20214362/post-save-user-signal-that-creates-user-profile-is-being-called-twice-causing-du ¡Gracias! Usted pensaría que esta configuración de administrador de User/UserProfile sería parte de la documentación de django. – chewynougat

+0

¡Muchas gracias! Finalmente logro que se comporte como debería, jaja –

0

Debe tener en cuenta la forma de agregar y cambiar. O bien, obtendrá un usuario no puede ser Ninguno error al intentar crear un usuario. El siguiente ha sido probado y funciona 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) 
Cuestiones relacionadas