Dhango 1.11, как фильтровать содержимое фильтра? - PullRequest
0 голосов
/ 15 апреля 2019

Django 1.11 Python 3.6

У меня есть две модели, одна использует выпадающий фильтр из списка другой модели, и все это работает:

models.py

class Office(models.Manager):
      ...code....

class Customer(models.Manager):
      ...code....   
    office = models.ForeignKey(Office, blank=False, null=False)
      ...code....   
admin.py

class CustomerAdmin( admin.ModelAdmin):
    list_filter = ["office", "<some_other_filter>"]

Я получаю выпадающий список со списком офисов в моем представлении клиентов, как я и хотел, все работает.

Теперь по какой-либо причине я хотел бы отфильтровать содержимое фильтра "office" в представлении Customer, например, удалить некоторые записи из этого раскрывающегося списка, но только для фильтра - данные представления Office должны остаться прежними, то есть полный список. Переопределение get_queryset в class Office не делает этого, на самом деле, оно делает противоположное тому, что мне нужно - оно только фильтрует данные, которые передаются в представление, но не список записей в фильтре. Есть ли чистый и простой способ фильтрации фильтров в Django 1.11?

1 Ответ

0 голосов
/ 15 апреля 2019

Отвечая на мой собственный вопрос ... Вот как я получил то, что хотел (по аналогии с Создание пользовательских фильтров для list_filter в Django Admin ):

in admin.py
from django.contrib.admin import SimpleListFilter
class MyCustomFilter(SimpleListFilter):
    title = '<some title>'
    parameter_name = '<some_entity>__id__exact'
    def lookups(self, request, model_admin):
        all_entries = model_admin.model.objects.all()
        filtered_entries = set([<bunch of code to do the filtering>])
        return set([(<dropdown_entry>.id, <dropdown_entry>.name) for entry in filtered_entries])

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

        return queryset.all()

in models.py
class CustomerAdmin( admin.ModelAdmin):
    # list_filter = ["office", "<some_other_filter>"]
    list_filter = [MyCustomFilter, "<some_other_filter>"]

...