如何在管理界面中内联编辑 django 用户配置文件?

Posted

技术标签:

【中文标题】如何在管理界面中内联编辑 django 用户配置文件?【英文标题】:How do I inline edit a django user profile in the admin interface? 【发布时间】:2011-03-24 23:01:17 【问题描述】:

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

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users http://www.djangobook.com/en/1.0/chapter12/#cn222

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

【问题讨论】:

只是给新读者的提示,AUTH_PROFILE_MODULE 大约在 8 年前被弃用:code.djangoproject.com/ticket/15937 【参考方案1】:

好吧,事实证明这很容易,只要你知道怎么做。这是我的 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 的新类。只是觉得我应该分享。

【讨论】:

您如何处理密码表单链接?只是这些更改破坏了它,因为它只是在添加具有名称和密码的用户后才能从更改表单中看到。 以上内容几乎是正确的,“密码表单链接”的正确方法是扩展自定义UserAdmin,而不是使用admin.ModelAdmin - 尝试:from django.contrib.auth.admin import UserAdmin 然后class UserProfileAdmin(UserAdmin): 【参考方案2】:

我建议对 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)

【讨论】:

关于如何将UserProfileInline 移到顶部的任何想法:? 此功能已被多次请求,code.djangoproject.com/ticket/4848 是最旧的。它尚未实施。【参考方案3】:

我建议对罗伯特的解决方案进行另一项改进:

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 部分将显示在“添加用户”屏幕上,该屏幕应该只是询问用户名和密码。如果您在保存之前更改该屏幕上的任何配置文件数据(远离默认值),您将收到“重复键”数据库错误。

【讨论】:

在这里彻底解决了我的问题:***.com/questions/20214362/… 谢谢!你会认为这个 User/UserProfile 管理员设置将成为 django 文档的一部分。 非常感谢!最后我让它表现得像它应该的那样哈哈【参考方案4】:

您必须考虑添加和更改表单。否则,您将在尝试创建用户时收到用户不能为无错误。以下已在 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)

【讨论】:

以上是关于如何在管理界面中内联编辑 django 用户配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin 中自定义多对多内联模型

Django Admin 中的内联

django admin 内联(和嵌套内联):我怎样才能获得这个功能?

在管理界面上向 Django 内联对象添加自定义操作

如何从 django 中的内联表单接收上传的文件?

Django管理类别和对象