Отрицательный пользовательский Django admin FilterSpec

Я работаю над настраиваемым Django Admin FilterSpec (уже описанным в SO # 991926) . My FilterSpec является заменой фильтра по умолчанию для ForeignKey (User) и в основном заменяет список всех пользователей тремя вариантами: все, мое и другие.

Например, если бы я применил настраиваемую спецификацию фильтров к полю created_by, он добавил бы фильтр администратора со списком «Все», «Создано мной» и «Создано другими». Все работает кроме отрицательного фильтра, созданного другими.

Я пытался добиться этого, добавляя __not к запросу так:

def choices(self, cl):
    yield {
            'selected': self.lookup_val == self.user.pk,
            'query_string': cl.get_query_string({'%s__not' % self.field.name: self.user.pk}),
            'display': capfirst('%s Others' % self.field.verbose_name)
        }

Не похоже, что Django поддерживает такую ​​негативную фильтрацию. Я также экспериментировал с тем, чтобы он выполнял __gte и __lte, но filterpec использует только первый найденный (gte), отбрасывая другой (lte).

Кто-нибудь знает, как добиться такого отрицательного фильтра с помощью настраиваемого FilterSpec?


person T. Stone    schedule 14.11.2009    source источник


Ответы (2)


Эта функция еще не является частью кода Django; это планируется в версии 1.2. Вам нужно будет применить этот патч к коду Django: http://code.djangoproject.com/ticket/5833

Используйте get_query_set() метод FilterSpec. Например:

class AlunoStatus(FilterSpec):
    def __init__(self, request, params, model, model_admin):
        self.lookup_val = request.GET.get('exclude_value', None)

    def get_query_set(self, cl, qs):
        if self.lookup_val:
            qs = qs.exclude(field=self.lookup_val)
        return qs

    def choices(self, cl):
        yield {'selected': self.lookup_val is None,
               'query_string': cl.get_query_string({}, ['exclude_value']),
               'display': _('All')}
        for choice in choices:
            yield {'selected': self.lookup_val == choice,
                    'query_string': cl.get_query_string({'exclude_value': choice}),
                    'display': u"Exclude "+smart_unicode(choice)}

Я не тестировал это, но надеюсь, вы поняли идею.

person gerdemb    schedule 16.11.2009
comment
Собственно даже не в этом. :) Это функция среднего приоритета для версии 1.2. Я использую патч code.djangoproject.com/ticket/5833 для Django 1.0. - person gerdemb; 16.11.2009
comment
Вы знаете, я просмотрел код FilterSpec в библиотеках django, и мне было интересно, откуда вы это берете. На данный момент я думаю, что подожду, пока он не попадет в ствол, но я обязательно буду следить за тем, чтобы этот метод get_query_set стал доступным. - person T. Stone; 18.11.2009
comment
Это не только не вошло в 1.2, но и не вошло в грядущую 1.3. Однако патч по-прежнему работает, и все, что ему нужно, - это тесты и документация, так что, возможно, он будет хорошим кандидатом для версии 1.4. - person Jough Dempsey; 14.03.2011

Не будет ли использовать фильтр «исключить» для работы отрицания?

person Arthur Debert    schedule 14.11.2009
comment
В обычном запросе так и будет, но в спецификации фильтра используется формат {'key':'value'} - ›.filter(key=value). Отсюда и проблема. :) - person T. Stone; 14.11.2009