我有一个内联formset,我想排除一些模型对象显示在formset中。Django管理员,过滤对象的内联formset
例如,有模型B有模型A的外键,所以它是一个1:n(一个对象有很多B对象)的关系。现在在管理编辑页面上,我已经获得了B的内联。我想知道是否有可能在内联表单呈现之前过滤B对象的列表,因此并非所有与A相关的B对象都进入了表单集。
我有一个内联formset,我想排除一些模型对象显示在formset中。Django管理员,过滤对象的内联formset
例如,有模型B有模型A的外键,所以它是一个1:n(一个对象有很多B对象)的关系。现在在管理编辑页面上,我已经获得了B的内联。我想知道是否有可能在内联表单呈现之前过滤B对象的列表,因此并非所有与A相关的B对象都进入了表单集。
在回答自己的问题可能看起来有点怪,但我发现了另一个解决方案;)
有提供自定义查询集到一个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
...
你可以写你自己的经理给你模型(专用于formset)并使用它。
非常感谢。这看起来像一个很好的解决方案,但我将不得不在其他所有地方使用另一个(非默认)管理器,因为我需要那些过滤掉的对象,而不是在管理页面中。我很遗憾没有管理选项可以为内联提供自定义而非默认管理器。 – 2010-01-21 07:35:43
嗯,我发现我可以通过继承BaseInlineFormSet(http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#model-formsets)为内联提供非默认的queryset/manager,然后提供这个formset以'formset'属性为InlineModelAdmin。太好了! – 2010-01-21 07:57:18
如果您编写自己的经理,如果您的模型也在Django Admin中注册,则可能需要采取更多的解决方法。 – OverClocked 2011-01-26 14:25:39
非常好 - 这正是我一直在寻找的。使用私有属性'_queryset'会阻止SQL查询每页发射数十次。非常好。 – richbs 2010-10-13 14:38:14