2015-07-05 2 views
0

Django 1.8: Как показано ниже, у меня есть модель местоположения с внешним ключом модели Study. Я хочу показать исследования, которые включают country = 'usa' и is_active = True. Проблемы с использованием фильтра по умолчанию является то, что если у меня есть:django admin - как отменить фильтр на нескольких внешних ключах

study1: 
country='usa', is_active=False 
country='canada', is_active=True 

фильтр отображает это исследование, но это не так здесь следует то, что я пробовал:

##### models.py: 
class Study(models.Model): 
    title = models.CharField(max_length=30) 
    def __unicode__(self): 
     return self.title 

class Location(models.Model): 
    is_active = models.BooleanField() 
    country = models.CharField(max_length=30) 
    study = models.ForeignKey(Study, related_name='location') 

    def __unicode__(self): 
     return self.country 

##### admin.py 
class ActiveCountryFilter(admin.SimpleListFilter): 
    title = _('Active Country Filter') 
    parameter_name = 'country' 

    def lookups(self, request, model_admin): 
     # distinct keyword is not supported on sqlite 
     unique_countries = [] 
     if DATABASES['default']['ENGINE'].endswith('sqlite3'): 
      countries = Location.objects.values_list('country') 
      for country in countries: 
       if country not in unique_countries: 
        unique_countries.append(country) 
     else: 
      unique_countries = Location.objects.distinct('country').values_list('country') 
     return tuple([(country, _('active in %s' % country)) for country in unique_countries]) 

    def queryset(self, request, queryset): 
     if self.value(): 
      return queryset.filter(location__country=self.value(), location__is_active=True) 
     else: 
      return queryset 

@admin.register(Study) 
class StudyAdmin(admin.ModelAdmin): 
    list_display = ('title',) 
    list_filter = ('location__country', ActiveCountryFilter) 

Фильтр не отображение чего-либо. Любые идеи о том, как достичь того, чего я хочу? Я также прочитал документ о RelatedFieldListFilter, но это довольно запутанно.

ответ

0

Я понял. Просто небольшая ошибка в поиске. Я должен был выбрать страну с индексом ноль: Коррекция:

return tuple([(country[0], _('active in %s' % country[0])) for country in unique_countries]) 

Я надеюсь, что этот пример помогает другим.

Смежные вопросы