2010-01-20 75 views
10

我有一个内联formset,我想排除一些模型对象显示在formset中。Django管理员,过滤对象的内联formset

例如,有模型B有模型A的外键,所以它是一个1:n(一个对象有很多B对象)的关系。现在在管理编辑页面上,我已经获得了B的内联。我想知道是否有可能在内联表单呈现之前过滤B对象的列表,因此并非所有与A相关的B对象都进入了表单集。

回答

18

在回答自己的问题可能看起来有点怪,但我发现了另一个解决方案;)

有提供自定义查询集到一个formset一个问题,就是内联表单集的情况下,没有钩为了这。所以我subclassed BaseInlineFormSet并重写get_queryset方法。然后,我只是在InlineModelAdmin中提供这个表单并完成了。

例子:

class MyFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     if not hasattr(self, '_queryset'): 
      qs = super(MyFormSet, self).get_queryset().filter(main=False) 
      self._queryset = qs 
     return self._queryset 

和管理类:

class MyInline(admin.TabularInline): 
    model = m.MyModel 
    formset = MyFormSet 
    ... 
+0

非常好 - 这正是我一直在寻找的。使用私有属性'_queryset'会阻止SQL查询每页发射数十次。非常好。 – richbs 2010-10-13 14:38:14

0

你可以写你自己的经理给你模型(专用于formset)并使用它。

http://docs.djangoproject.com/en/dev/topics/db/managers/

+0

非常感谢。这看起来像一个很好的解决方案,但我将不得不在其他所有地方使用另一个(非默认)管理器,因为我需要那些过滤掉的对象,而不是在管理页面中。我很遗憾没有管理选项可以为内联提供自定义而非默认管理器。 – 2010-01-21 07:35:43

+1

嗯,我发现我可以通过继承BaseInlineFormSet(http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#model-formsets)为内联提供非默认的queryset/manager,然后提供这个formset以'formset'属性为InlineModelAdmin。太好了! – 2010-01-21 07:57:18

+0

如果您编写自己的经理,如果您的模型也在Django Admin中注册,则可能需要采取更多的解决方法。 – OverClocked 2011-01-26 14:25:39