Pergunta

Se você deseja armazenar informações extras sobre um usuário (django.contrib.auth.models.user) no Django, você pode usar o NIFTY auth_profile_module para conectar um modelo "perfil". Cada usuário obtém um perfil. Tudo está descrito aqui:

Agora, digamos que eu criei um aplicativo chamado contas com um modelo chamado UserProfile e o registrei como modelo de perfil para meus usuários. Como envolto a edição do perfil na interface do administrador para editar usuários (ou vice -versa)?

Foi útil?

Solução 3

Bem, acontece que isso é bastante fácil, uma vez que você sabe como fazê -lo. Este é o meu MyApp/Contas/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)

O padrão admin.UserAdmin A classe ModelAdmin para usuários não é registrada e uma nova especificando um inline UserProfile está registrado em seu lugar. Apenas pensei que eu deveria compartilhar.

Outras dicas

Eu propus uma versão ligeiramente aprimorada da solução de André, pois ela quebra a visualização da lista em/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)

Proponho outra melhoria à solução 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)

Sem essa alteração no UserAdmin, a seção Custom UserProfileInline será exibida na tela "Adicionar usuário", que deve pedir o nome de usuário e a senha. E se você alterar algum dos dados do perfil nessa tela (longe dos padrões) antes de salvar, obterá um erro de banco de dados "chave duplicada".

Você deve considerar o formulário Adicionar e Alterar. Caso contrário, você receberá um usuário não pode ser um erro ao tentar criar um usuário. O seguinte foi testado e trabalha em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top