DjangoAdmin:在内联管理员中访问父实例

时间:2017-03-28 20:48:49

标签: python django django-models django-admin admin

我有一个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方法访问父对象。

有没有人知道实现这一目标的方法?

1 个答案:

答案 0 :(得分:1)

我在StackOverflow中找到了similar question,并使用那里描述的方法来解决它。

它使用内联中的parent_model属性和resolve中的django.core.urlresolvers方法来获取基于网址的实例。

以下是代码:

    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

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

希望它有所帮助!