我有一個內聯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