Python 如何在用户管理选项卡(Django admin)中的用户配置文件中使ManyToManyField可见
如何使Python 如何在用户管理选项卡(Django admin)中的用户配置文件中使ManyToManyField可见,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,如何使UserProfile的manytomy属性(其属性user=OneToOne(user)在Django Admin中可见) 因此,我使用一个常见的用户模型来登录/注册。这个用户模型通过在userprofile模型中使用OneToOneField(User,related_name='userprofile')进行扩展 UserProfile具有ManyToManyField属性: languages=models.ManyToManyField(语言,通过='UserProfileLan
UserProfile
的manytomy
属性(其属性user=OneToOne(user)
在Django Admin
中可见)
因此,我使用一个常见的用户
模型来登录/注册。这个用户
模型通过在userprofile
模型中使用OneToOneField(User,related_name='userprofile')
进行扩展
UserProfile
具有ManyToManyField
属性:
languages=models.ManyToManyField(语言,通过='UserProfileLanguage')
这就是问题所在
我在Django Admin
的User
选项卡中看不到语言
。
我可以在User
选项卡中看到所有UserProfile
属性,因为我这样做了:
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'User_Profile'
class UserAdmin(BaseUserAdmin):
inlines = (UserProfileInline, )
但是UserProfile
的唯一属性是User
选项卡中看不到的languages
。我读到这可能是因为它是ManyToManyField
但是我找不到如何将它放在User
选项卡中
我试图将其作为一个内联模型,但它引发了错误:
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'User_Profile'
class UserProfileLanguageLevelInline(admin.TabularInline):
model = UserProfileLanguage
# THIS DOES NOT WORK EITHER: model = User.userprofile.languages.through
class UserAdmin(BaseUserAdmin):
inlines = (UserProfileInline, UserProfileLanguageLevelInline)
<class 'SolutionsForLanguagesApp.admin.UserProfileLanguageLevelInline'>: (admin.
E202) 'SolutionsForLanguagesApp.UserProfileLanguage' has no ForeignKey to 'auth.
User'.
class UserProfileInline(admin.StackedInline):
model=UserProfile
can_delete=False
详细名称复数='User\u Profile'
类UserProfileLanguageLevelInline(管理列表行):
model=UserProfileLanguage
#这也不起作用:model=User.userprofile.languages.through
类UserAdmin(BaseUserAdmin):
inlines=(UserProfileInline,UserProfileLanguageLevelInline)
:(行政。
E202)“SolutionsForLanguagesApp.UserProfileLanguage”没有“auth”的外键。
用户'。
这是因为
languages
是UserProfile
的一个属性,而不是User
,但我不知道如何解决这个问题。在您的情况下,如果您可以查看语言
,但不编辑用户
选项卡中的字段,则应使用只读字段
:
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'User_Profile'
readonly_fields = ('languages',)
class UserAdmin(BaseUserAdmin):
inlines = (UserProfileInline, )
谢谢Javier,如果我能更改语言和级别,那就最好了。这可以让它在Userprofile选项卡中工作,但不能在User选项卡中这样工作。你知道该怎么做吗?非常感谢你。我想,在你的第一个例子中,原因是
通过class='UserProfileLanguage'
创建一个中间表应用程序_userprofile\u languages
更容易进行ORM筛选,但无法理解数据为何未公开或没有任何警告。因此,如果您不通过使用,您可以看到语言
。在第二个示例中,当您管理站点.register(用户,用户管理员)时
modelUserProfileLanguage
没有FK toUser
,如果您确实显示了该表中的字段。我希望解释一下,如果其他人可以帮助理解这一点。