Django admin сбросить запрос в окне поиска при выборе фильтра - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть следующий класс в Django admin модели:

class TopUpsAdmin(admin.ModelAdmin):
    search_fields = ('user__email', 'user__phone_number',)
    list_filter = ('status',)

В настоящее время поведение фильтра по умолчанию

if search box in the listing page is input with test_1 which is a user name and search up the result(url will have the following parameter /?q=test_1) , if select an option in the filter then the filter results also got affected by the search box query on the URL ?q=test_1&status__exact=1)

I хотел бы, чтобы результаты поиска не фильтровали список, когда я выбираю фильтр.

Чтение Django Документы только предоставляют мне, как переопределить фильтр с существующим запросом в параметре (который приходит из поля поиска).

Любая помощь будет признательна

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Создайте Admin SimpleListFilter и примените приведенный ниже миксин

from django.utils.translation import gettext_lazy as _

class FilterMixin:
    def choices(self, changelist):
        yield {
            'selected': self.value() is None,
            'query_string': changelist.get_query_string(remove=[self.parameter_name, <b>'q'</b>]),
            'display': _('All'),
        }
        for lookup, title in self.lookup_choices:
            yield {
                'selected': self.value() == str(lookup),
                'query_string': changelist.get_query_string({self.parameter_name: lookup}, <b>remove=['q']</b>),
                'display': title,
            }

Полная база кода

#models.py
class Person(models.Model):
    class GenderChoice(models.IntegerChoices):
        MALE = 1
        FEMALE = 2
        OTHER = 3

    name = models.CharField(max_length=20)
    gender = models.IntegerField(choices=GenderChoice.choices)

    def __str__(self):
        return self.name

# admin.py
class GenderFilter(<b>FilterMixin, admin.SimpleListFilter</b>):
    title = 'Gender'
    parameter_name = 'gender'

    def lookups(self, request, model_admin):
        return Person.GenderChoice.choices

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(**{'gender': int(self.value())})
        else:
            return queryset


class PersonAdmin(admin.ModelAdmin):
    search_fields = ('name',)
    <b>list_filter = (GenderFilter,)</b>


admin.site.register(Person, PersonAdmin)
0 голосов
/ 03 мая 2020

Я думаю, вы можете переопределить get_search_results метод. См. Документацию: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django .contrib.admin.ModelAdmin.get_search_results

Пример:

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age')
    search_fields = ('name',)

    def get_search_results(self, request, queryset, search_term):
        if len(request.GET) > 1:
            search_term = None
        queryset, use_distinct = super().get_search_results(request,
                                                            queryset,
                                                            search_term)
        return queryset, use_distinct
...