Como faço para editar um perfil de usuário do Django na interface do administrador?
-
25-09-2019 - |
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:
- http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
- http://www.djangobook.com/en/1.0/chapter12/#cn222
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)?
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)