2013-11-22 85 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'。 –

相关问题