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

And*_*zlo 19 django django-admin django-users

如果你想在Django中存储关于用户(django.contrib.auth.models.User)的额外信息,你可以使用漂亮的AUTH_PROFILE_MODULE来插入"profile"模型.然后每个用户获取一个配置文件 这一切都在这里描述:

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

Rob*_*oix 29

我提出了一个稍微改进的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)
Run Code Online (Sandbox Code Playgroud)


abj*_*ngs 16

我建议对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)
Run Code Online (Sandbox Code Playgroud)

如果不对UserAdmin进行此更改,则自定义UserProfileInline部分将显示在"添加用户"屏幕上,该屏幕应该是要求输入用户名和密码.如果在保存之前更改了该屏幕上的任何配置文件数据(远离默认值),您将收到"重复键"数据库错误.


And*_*zlo 14

嗯,事实证明,一旦你知道怎么做,这很容易.这是我的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)
Run Code Online (Sandbox Code Playgroud)

admin.UserAdmin用户的默认ModelAdmin类是未注册的,并且UserProfile在其位置注册了指定内联的新类.只是想我应该分享.

  • 以上几乎是正确的,"密码表单链接"的正确方法是扩展自定义`UserAdmin`而不是使用`admin.ModelAdmin` - 尝试:`from django.contrib.auth.admin import UserAdmin` then `class UserProfileAdmin(UserAdmin):` (2认同)