¿Cómo puedo edición en línea un perfil de usuario de Django en la interfaz de administración?

StackOverflow https://stackoverflow.com/questions/3400641

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:

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

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top