2010-08-04 38 views
30

Mi sitio utiliza el modelo de Usuario de Autenticación de Usuario de Django y un modelo de Perfil de Usuario personalizado para almacenar algunos datos adicionales (fecha de nacimiento, etc.). ¿Hay alguna forma de crear una vista en el administrador de Django que entrelaza los campos de los modelos Usuario y Perfil de usuario?Django Admin: ¿cómo mostrar los campos de dos modelos diferentes en la misma vista?

Sospecho que este fragmento de código no está ni siquiera cerca, pero tal vez ayudará a ilustrar lo que estoy tratando de hacer: Mensaje de

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) 

error:

ImproperlyConfigured: UserProfileAdmin.list_display [2], 'User.email' no es un atributo invocable o de 'UserProfileAdmin' o se encuentra en el modelo 'UserProfile'.

En última instancia, estoy tratando de crear una vista de administración que tiene primera & apellido de PerfilUsuario y correo electrónico de usuario.

Respuesta

37

para la visualización de usuario de correo electrónico es necesario tener un método de UserProfile o UserProfileAdmin que devuelve el correo electrónico

en PerfilUsuario

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

o en UserProfileAdmin

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

luego cambia de list_display a

list_display = ('name', 'gender', 'user_email') 
+1

Bastante seguro que puedes usar la notación de guion bajo user__email sin necesidad de definir la función extra – Hugoagogo

+1

@Hugoagogo En realidad no puedes. Aquí está el [ticket for it] (https://code.djangoproject.com/ticket/5863) cerrado como no se solucionará. –

+0

Aparentemente hoy, es una solución ... ¡El mismo enlace al final! – HydrUra

14

Puede intentar usar InlineModelAdmin para mostrar los formularios de usuario y de perfil de usuario en una vista administrativa.

Para mostrar la información del perfil de usuario en la lista de cambios se puede crear un nuevo método que delega los valores de UserProfile a User modelo.

Por ejemplo, esto debería funcionar más o menos :)

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) 
+0

Gracias por la respuesta. Resulta que el de Ashok era exactamente lo que necesitaba, pero estoy viendo este enfoque también. Lo aprecio. – Joe

+0

Pasé algún tiempo con esto, también funciona. Pregunta de seguimiento: parece que no puedo acceder a algunas de las propiedades definidas en UserProfile desde UserProfileInline. ¿Hay alguna forma de hacer esto? – Joe

+1

"clase UserAdmin (UserAdmin):" la línea debe corregirse como "clase UserAdmin (admin.ModelAdmin):" – israkir

1

Usando Ashoks encima respuesta que hice fragmento que simplifica este proceso para gran número de campos

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 
Cuestiones relacionadas