2015-09-01 91 views
2

我的Django模型是这样的:Django管理员:按国家筛选。只显示非空国家?

from django.db import models 
from django_countries.fields import CountryField 

class Profile(models.Model): 
    name = models.CharField(max_length=200) 
    country = CountryField() 

在管理,我想按国家过滤。但是当我将country添加到list_filter时,我得到了右边所有国家的大量列表。有没有办法将过滤器列表限制为仅包含实际至少分配了Profiles的国家?

这与Can I make list_filter in django admin to only show referenced ForeignKeys?相似,但不是重复。请注意,这里我使用的是django_countries,而不是ForeignKey,这使得此问题有所不同。

注意:我使用的是Django 1.7,所以我无法访问RelatedOnlyFieldListFilter。

回答

0
class CountryListFilter(admin.SimpleListFilter): 
    title = 'Country' 
    parameter_name = 'country' 

    def lookups(self, request, model_admin): 
     countries = set([t.country for t in model_admin.model.objects.filter(country!=None)]) 
     return [(country, country)for country in countries] 

    def queryset(self, request, queryset): 
     if self.value(): 
      return queryset.filter(country=self.value()) 
     else: 
      return queryset