Custom change_list filter based on SimpleListFilter shows only referenced (related, used) values

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from django.contrib.admin import SimpleListFilter

# admin.py
class CountryFilter(SimpleListFilter):
    title = 'country' # or use _('country') for translated title
    parameter_name = 'country'

    def lookups(self, request, model_admin):
        countries = set([c.country for c in model_admin.model.objects.all()])
        return [(c.id, c.name) for c in countries]
        # You can also use hardcoded model name like "Country" instead of 
        # "model_admin.model" if this is not direct foreign key filter

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

#
# Example setup and usage
#

# models.py
from django.db import models

class Country(models.Model):
    name = models.CharField(max_length=64)

class City(models.Model):
    name = models.CharField(max_length=64)
    country = models.ForeignKey(Country)

# admin.py
from django.contrib.admin import ModelAdmin

class CityAdmin(ModelAdmin):
    list_filter = (CountryFilter,)

admin.site.register(City, CityAdmin)

More like this

  1. User manager by diverman 3 years, 10 months ago
  2. ForeignKey filterspec by luc_j 2 years, 8 months ago
  3. SelectRelatedManager by realmac 1 year, 8 months ago
  4. Allow foreign key attributes in list_display with '__' by jcushman 3 months, 2 weeks ago
  5. Limit ForeignKey filter values to those that have a relationship with current model by overclocked 2 years, 6 months ago

Comments

(Forgotten your password?)