2013-11-22 139 views
3

我想通過外鍵指向的表中的一個字段來過濾我的list_filters之一。在Django admin中根據外鍵中的字段過濾list_filter

我的模型:

class Organisation(models.Model): 
    name = models.CharField() 
    COMPANY = 'COMPANY' 
    CHARITY = 'CHARITY' 
    ORG_CHOICES = (
     (COMPANY, 'COMPANY'), 
     (CHARITY, 'CHARITY'), 
     ) 
    type = models.CharField(choices = ORG_CHOICES) 

class Issue(models.Model): 
    name = models.CharField 
    charity = models.ForeignKey(Organisation) 

我想放在IssueAdmin:

list_filter = (charity) 

而且爲提供慈善機構的名單。目前它只列出了組織模型中的所有內容,包括慈善機構和公司。例如,我在那一刻得到這個列表過濾:

oxfam 
yamaha 
greenpeace 
microsoft 

當我想要一個過濾器,列出:

oxfam 
greenpeace 

我可以分裂組織表分成兩個表解決這個(慈善和公司),但感覺不對。

看起來像SimpleListFilter應該可以工作,但到目前爲止我還沒有任何運氣。基本上我想什麼用途以下過濾器和返回慈善機構的列表過濾:在過濾器

Organisation.objects.filter(type = 'CHARITY') 

我的(差)的嘗試:

class CharityFilter(SimpleListFilter): 
    title = _('Charity') 
    parameter = _('charity__type') 
    def lookups(self, request, model_admin): 
     return Organisation.objects.filter(type = 'CHARITY') 

    def queryset(self, request, queryset): 
     if not self.value() is not None: 
      return queryset.filter(type = 'CHARITY') 
     else: 
      return queryset 

任何一個能幫助我嗎?

回答

3

如果我得到它的權利,你」重試不是按照他們所屬的組織的類型來過濾問題實例,而是由組織實例本身來篩選問題實例,因此您將在右側有一個潛在的非常長的組織列表來過濾問題,但您只希望顯示CHARITies在這個列表中。

這可能不是最好的解決辦法,如果有很多組織,但前提是他們幾個......

無論如何,每Django文檔:https://docs.djangoproject.com/en/dev/ref/contrib/admin/的查找()一個過濾器的方法必須返回元組列表(coded_value,displayed_value)。

下面未經測試的代碼應該在你的情況下工作:

class CharityFilter(SimpleListFilter): 
    title = _('Charity') 
    parameter_name = 'charity' 
    def lookups(self, request, model_admin): 
     queryset = model_admin.queryset(request).filter(organisation__type='CHARITY') 
     return queryset.values_list('organisation__pk','organisation__name').order_by('organisation__name') 

    def queryset(self, request, queryset): 
     if self.value(): 
      return queryset.filter(organisation=self.value()) 
+1

工作。我必須將.distinct()添加到查找返回的末尾,否則它會列出相同時間的慈善組織100次。但是,否則,它完美的作品。謝謝。 –

4

你爲什麼不只是過濾的類型,即:

class OrganisationAdmin(admin.ModelAdmin): 
    list_filter = ("type",) 
    # etc 

這將讓你有任何的所有組織,企業只有慈善機構或只。

否則,如果您真的想要將「慈善機構」和「公司」視爲具有不同管理員的獨立實體,但仍將它們保留在同一個表中,則可以使用代理模型,但我在這裏看不到這一點。

編輯:過濾基於組織類型的問題,它工作得同樣與上查詢中繼模式(不是一個驚喜,因爲這正是發生)

class IssueAdmin(admin.ModelAdmin): 
    list_filter =("organisation__type",) 
+0

對不起,我本來應該更清楚,我想這樣做是IssueAdmin。如果它在OrganisationAdmin中,您建議的工作。 –

+2

工作原理相同,請參閱我編輯的答案。 –

+0

這只是讓我過濾慈善機構和公司之間。這不是我想要做的。當我將「慈善機構」放入list_filter時,它給了我一個過濾器中組織模型中所有條目名稱的列表。所以這個名單包括'oxfam','greenpeace','微軟'。我只想讓它展示'oxfam'和'greenpeace'。 –

相關問題