Отрицательный пользовательский админка Django FilterSpec - PullRequest
2 голосов
/ 14 ноября 2009

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

Например, если бы я применил пользовательскую спецификацию фильтров к полю 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, но в файле specpec используется только первый найденный (gte), а другой (lte) отбрасывается.

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

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Эта функция еще не является частью кода 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)}

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

0 голосов
/ 14 ноября 2009

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

...