Как встроить редактировать профиль пользователя django в интерфейсе администратора?
Если вы хотите сохранить дополнительную информацию о пользователе (django.contrib.auth.models.User) в Django, вы можете использовать изящный AUTH_PROFILE_MODULE для подключения модели "профиля". Затем каждый пользователь получает профиль. Это все описано здесь:
Теперь предположим, что я создал приложение под названием учетные записи с моделью UserProfile и зарегистрировал его в качестве модели профиля для своих пользователей. Как встроить редактирование профиля в интерфейс администратора для редактирования пользователей (или наоборот)?
4 ответа
Что ж, получается, что это довольно легко, если вы знаете, как это сделать. Это мой myapp/accounts/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)
По умолчанию admin.UserAdmin
Класс ModelAdmin для пользователей не зарегистрирован, а новый указывает на встроенный класс UserProfile
зарегистрирован на своем месте. Просто подумал, что должен поделиться.
Я предлагаю немного улучшенную версию решения Андре, поскольку оно нарушает представление списка в /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)
Я предлагаю еще одно усовершенствование решения Роберта:
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)
Без этого изменения в UserAdmin пользовательский раздел UserProfileInline будет отображаться на экране "Добавить пользователя", который должен запрашивать имя пользователя и пароль. И если вы измените какие-либо данные профиля на этом экране (в отличие от настроек по умолчанию) перед сохранением, вы получите ошибку базы данных "дубликат ключа".
Вы должны рассмотреть форму добавления и изменения. В противном случае вы получите пользователь не может быть ошибка при попытке создать пользователя. Следующее было протестировано и работает в 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)