Django——利用子类化UserAdmin来创建动态模板?

2024-10-02 00:24:19 发布

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

我不太清楚我要问的问题该如何措辞。假设有两个profile对象可能与一个用户关联。其中只有一个是关联的(有一对一的映射),但它可能是两个可能的profile对象之一。我的管理代码如下:

admin.site.unregister(User)

class AProfileInline(admin.StackedInline):
    model = UserProfileA

class BProfileInline(admin.StackedInline):
    model = UserProfileB

class UserProfileAdmin(UserAdmin):
    inlines = [AProfileInline, BProfileInline, ]

admin.site.register(User, UserProfileAdmin)

这可以正常工作,但它当然会显示不必要的信息。如果管理页面只显示正确的内联,那就太好了。我想这很复杂,可能是个问题,如果我想从一个配置文件类型更改为另一个配置文件类型。有什么想法吗?在


Tags: 对象用户类型modeladmin配置文件siteprofile
1条回答
网友
1楼 · 发布于 2024-10-02 00:24:19

这是一种方法。记住,这是一次黑客攻击。我基于ModelAdmin中的ModelAdmin代码。在

admin.site.unregister(User)

class AProfileInline(admin.StackedInline):
    model = UserProfileA

class BProfileInline(admin.StackedInline):
    model = UserProfileB

class UserProfileAdmin(UserAdmin):
    inlines = [AProfileInline, BProfileInline, ]

    def get_object(self, *args, **kwargs):
        obj = super(UserProfileAdmin, self).get_object(*args, **kwargs)
        if obj:
            self.inline_instances = []
            if AProfileInline.model.objects.filter(user=obj):
                inline_instance = AProfileInline(self.model, self.admin_site)
                self.inline_instances.append(inline_instance) 
            if BProfileInline.model.objects.filter(user=obj):
                inline_instance = BProfileInline(self.model, self.admin_site)
                self.inline_instances.append(inline_instance)
        return obj

admin.site.register(User, UserProfileAdmin)

此解决方案假设UserProfileA和{}通过一个名为user的字段与User有外键关系。在

change_viewdelete_view函数调用get_object,因此在呈现这些视图之前,这段代码应该正确地替换内联表单实例。在

此代码重写get_object以执行以下额外操作:

  1. 默认情况下,内联表单为空(对于预先存在的对象)
  2. 如果发现引用当前UserProfileA(通过user字段)的UserProfileA,则添加UserProfileA的内联表单。在
  3. 如果发现一个引用当前UserProfileB(通过user字段)的UserProfileB引用当前UserProfileB的内联表单。在

此解决方案的怪癖:

  • UserProfileAdmin.__init__仍将创建self.inline_instances的默认版本,该版本将在使用change_view或{}时被覆盖。在
  • 这个函数从来就不是要做上面代码使用它的目的。如果在任何其他代码中调用UserProfileAdmin.get_object,则将不必要地重新计算内联表单。在

相关问题 更多 >

    热门问题