¿Cómo puedo edición en línea un perfil de usuario de Django en la interfaz de administración?
-
25-09-2019 - |
Pregunta
Si desea almacenar información adicional acerca de un usuario (django.contrib.auth.models.User) en Django puede utilizar el AUTH_PROFILE_MODULE ingeniosa a tapón en un modelo de "perfil". Después, cada usuario obtiene un perfil. Todo se describen a continuación:
- http: //docs.djangoproject .com / es / dev / temas / auth / # almacenar-adicional-información-sobre-usuarios
- http://www.djangobook.com/en/1.0/chapter12/# CN222
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 Inline la edición del perfil en la interfaz de administración para la edición de los usuarios (o viceversa)?
Solución 3
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 ModelAdmin admin.UserAdmin
predeterminada para los usuarios es no registrado y una nueva especificación de una línea UserProfile
se ha registrado en su lugar. Sólo pensé que debería compartir.
Otros consejos
propongo 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)
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 a UserAdmin, la sección UserProfileInline personalizada se mostrará en la pantalla "Agregar usuario", que simplemente se supone que pregunte por el nombre de usuario y contraseña. Y si cambia cualquiera de los datos del perfil en esa pantalla (lejos de los valores por defecto) antes de guardar, usted obtendrá una "llave duplicada" error de base de datos.
Hay que tener en cuenta la forma y el cambio complemento. De lo contrario obtendrá un usuario no puede contener ninguno de error al intentar crear un usuario. Lo 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)