Django Admin Inlines With OneToOne字段

2024-05-02 03:32:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的模型中,您可以看到我有一个与UserProfile具有OneToOne关系的SpecializedProfile,与django用户模型具有OneToOne关系。在

我想为包含UserProfile和django用户模型内联的SpecializedProfile创建一个管理员,这样我就可以一次创建一个SpecializedProfile,而不需要转到UserProfile页面和User页面。在

这是我的模型:

class UserProfile(models.Model):
    user_auth = models.OneToOneField(User, related_name="profile", primary_key=True)
    # more fields...


class SpecializedProfile(models.Model):
    profile = models.OneToOneField(UserProfile, related_name="specialized_profile", primary_key=True)
    # More fields...

下面是我创建管理员的尝试:

^{pr2}$

管理员不工作,我收到以下错误:

<class 'profiles.admin.ProfileInline'>: (admin.E202) 'profiles.UserProfile' has no field named 'trainer'.
<class 'profiles.admin.UserInline'>: (admin.E202) 'auth.User' has no ForeignKey to 'profiles.SpecializedProfile'.

似乎django希望inlines位于定义OneToOne字段的模型上,并且不接受反向关系。我宁愿不去重组我的模型来实现这个目标。。。有什么我可以做的,使内联工作与我的模型一样?在


Tags: django用户模型admin关系models管理员页面
3条回答

github上有一个django模块可以为您完成此操作,而不必反转关系:django_reverse_admin。在

一旦安装,您的管理员将如下所示:

# admin.py
from django_reverse_admin import ReverseModelAdmin


class SpecializedProfileAdmin(ReverseModelAdmin):
    model = SpecializedProfile
    inline_reverse = ['profile']
    inline_type = 'tabular'  # could also be 'stacked'

admin.site.register(SpecializedProfile, SpecializedProfileAdmin)

不幸的是,我不认为它可以实现嵌套内联(Django也不能),所以这只能解决部分问题。我知道您不想更改数据库结构,但SpecializedProfile看起来更像是UserProfile的一个子类。如果您像这样重写模型:

^{2}$

然后你可以让管理员这样:

# admin.py
from django_reverse_admin import ReverseModelAdmin

class UserProfileAdmin(ReverseModelAdmin):
    model = UserProfile
    inline_reverse = ['user_auth']
    inline_type = 'tabular'


class SpecializedProfileAdmin(ReverseModelAdmin):
    model = SpecializedProfile
    inline_reverse = ['user_auth']
    inline_type = 'tabular'

admin.site.register(SpecializedProfile, SpecializedProfileAdmin) 
admin.site.register(UserProfile, UserProfileAdmin)

这样,您就可以内联地查看UserProfile和SpecializedProfile的所有内容。在

我修复了这个错误,使反向内联,不是从配置文件到用户,而是从重写的用户到配置文件:

class ProfileInline(admin.StackedInline):
    model = Profile

class IspUserAdmin(UserAdmin):
    list_display = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'is_superuser', 'is_active')
    list_filter = ('date_joined', 'last_login', 'is_staff', 'is_superuser', 'is_active',)
    inlines = (ProfileInline,)

admin.site.unregister(User)
admin.site.register(User, IspUserAdmin)

然后我还调整了配置文件管理(删除了添加操作,并将一些字段链接改为自定义链接)。在

django.contrib.admin中没有nested inlines (inline inside inline)。在

也许这对你有帮助:

class UserInline(admin.TabularInline):
    model = User

class ProfileInline(admin.TabularInline):
    model = UserProfile
    inlines = [UserInline]

class SpecializedProfileAdmin(admin.ModelAdmin):
    model = SpecializedProfile
    inlines = [ProfileInline]

您还需要提供自己的模板,这些模板将在顶层内联和子级内联上进行嵌套迭代。在

再看看this,也许能帮到你。在

相关问题 更多 >