widgets is_valid formularios form fields example avanzados django django-models django-admin

is_valid - formularios django



Django Admin: ¿cómo mostrar los campos de dos modelos diferentes en la misma vista? (3)

Podría intentar usar InlineModelAdmin para mostrar los formularios User y UserPofile en una vista administrativa.

Para mostrar información de perfil de usuario en la lista de cambios, puede crear un nuevo método que delegue los valores de User de User Modelo de User .

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)

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?

Sospecho que este fragmento de código ni siquiera está cerca, pero tal vez ayude a ilustrar lo que intento hacer:

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)

Mensaje de error:

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

En última instancia, intento crear una vista de administrador con el nombre y apellido de UserProfile y el correo electrónico del usuario.


Usando la respuesta superior de Ashok, hice un fragmento que simplifica este proceso para una gran cantidad 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


para mostrar el correo electrónico del usuario debe tener un método en UserProfile o UserProfileAdmin que devuelva el correo electrónico

en UserProfile

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

o en UserProfileAdmin

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

luego cambia tu list_display a

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