如果你想在 Django 中存储有关用户 (django.contrib.auth.models.User) 的额外信息,你可以使用漂亮的 AUTH_PROFILE_MODULE 来插入“配置文件”模型。然后每个用户都会获得一个个人资料。全部描述如下:

现在,假设我已经创建了一个名为accounts 的应用程序,其中包含一个名为UserProfile 的模型,并将其注册为我的用户的配置文件模型。 如何在管理界面中内联配置文件的编辑以编辑用户(反之亦然)?

有帮助吗?

解决方案 3

好吧,事实证明这很容易,只要你知道如何去做。这是我的 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 已在其所在地注册。只是觉得我应该分享。

其他提示

我建议对 André 的解决方案进行稍微改进,因为它破坏了 /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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top