2010-01-20 131 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