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