Django Admin:访问内联管理员中的父实例

Posted

技术标签:

【中文标题】Django Admin:访问内联管理员中的父实例【英文标题】:DjangoAdmin: Accesing the parent instance within an Inline admin 【发布时间】:2017-08-22 02:57:44 【问题描述】:

我有一个 Django 管理类,它声明了一个可迭代的内联。比如:

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    ...
    ...
    inlines = [CategoryModifiersInline,]
    ...
    ...

然后我有一个像这样的内联管理类:

class CategoryModifiersInline(admin.TabularInline):

    model = Category.modifiers.through
    fk_name = 'category'
    extra = 1 


    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        qs = Product.objects.filter(is_modifier=True).filter(active=True)
        kwargs['queryset'] = qs
        return super(CategoryModifiersInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

我根据某些业务需求过滤外键的查询集。

此内联仅在 change 视图中向用户显示,这意味着,当创建 Category 类的对象并且用户想要为其添加修饰符时,绝不会在 add 视图中显示。

我想要做的是通过 Category 模型的属性之一过滤外键,我的意思是,我想从 formfield_for_foreignkey 方法访问父对象。

有谁知道实现这一目标的方法吗?

【问题讨论】:

也许这有帮助:***.com/a/12053145/633961 【参考方案1】:

嗯,我在 *** 这里找到了一个similar question,并使用那里描述的方法来解决它。

它使用内联的parent_model 属性和django.core.urlresolversresolve 方法来获取基于url 的实例。

代码如下:

    def get_object(self, request):
        resolved = resolve(request.path_info)
        if resolved.args:
             return self.parent_model.objects.get(pk=resolved.args[0])
        return None

然后我会在我的formfield_from_foreignkey 方法中调用get_object 方法来获取我想用作过滤器的对象的实例。

希望对你有帮助!

【讨论】:

以上是关于Django Admin:访问内联管理员中的父实例的主要内容,如果未能解决你的问题,请参考以下文章

django admin 在 save_model 方法中删除内联对象

Django Admin 中的内联

通过 Django Admin 中的内联显示编辑/添加外键对象

has_delete_permission 在 django admin inline 中获取父实例

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

Django Admin:动态添加内联