ограничить возможные фильтры list_filter непустыми - PullRequest
2 голосов
/ 19 марта 2011

У меня есть модель:

class Foo(models.Model):
   attribute = models.IntegerField()
   user = models.ForeignKey(user)

и администратор модели:

class FooAdmin(admin.ModelAdmin):
   list_filter = ('attribute',)

В администраторе я отображаю только объекты Foo активного пользователя, но фильтр атрибутовдайте мне все возможные атрибуты, даже те, которые не возвращают никаких объектов для этого пользователя.В конце у меня много разных значений фильтра, и большинство из них бесполезны для пользователя.Как я могу ограничить эти значения фильтра теми, которые соответствуют пользователю.

надеюсь, что это понятно

Приветствия

Решение: В admin.pyв вашем приложении укажите:

from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.contrib.auth.models import User
from sets import Set

class CustomChoiceFilterSpec(ChoicesFilterSpec):

    def __init__(self, f, request, params, model, model_admin):
        super(CustomChoiceFilterSpec, self).__init__(f, request, params, model,
                                                   model_admin)
    self.lookup_kwarg = '%s__attribute__exact' % f.name
    self.lookup_val = request.GET.get(self.lookup_kwarg, None)
    self.objects = list(Set([i.attribute for i in model.objects.filter(foo__user = request.user)])) # This is the magic line :) !

    def choices(self, cl):
        yield {'selected': self.lookup_val is None,
                'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
                'display': ('All')}
        for val in self.objects:
            yield {'selected': smart_unicode(val) == self.lookup_val,
                    'query_string': cl.get_query_string({self.lookup_kwarg: val.attribute}),
                    'display': val.attribute}

    def title(self):
        return "Attribute"
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'compact_filter', False), CustomChoiceFilterSpec)) 

В последней строке указано, что этот тип фильтра будет применяться только к объектам, для которых в качестве атрибута указан 'compact_filter'.

Поэтому мы добавили в нашу модель Foo(models.py):

attribute.compact_filter = True

Ответы [ 2 ]

1 голос
/ 19 марта 2011

К сожалению, переопределить эти фильтры list_filters непросто.

Наблюдается огромный прогресс в написании наших собственных фильтров списков, как вы можете видеть на этом билете: http://code.djangoproject.com/ticket/5833, но не получится сделать это для 1.3.

Все, что я могу предложить, - это начать использовать новый словарь: «FilterSpec», чтобы находить фрагменты кода от разных людей, которые смогли настроить свои собственные FilterSpecs для работы с SO и с Google.

Пользовательский фильтр в Django Admin на Django 1.3 или ниже
http://djangosnippets.org/snippets/1051/

Я воспользуюсь этой возможностью, чтобы возиться с FilterSpecs самостоятельно!

0 голосов
/ 19 марта 2011
list_filter = ['attribute_1', 'attribute_2']

Настройка фильтров для администратора

list_display = ('attribute_1', 'attribute_2')

Устанавливает атрибуты, которые будут отображаться в таблице представления администратора для вашей конкретной модели.

Если они были введены правильно, я уверен, что вы уже пытались перезапустить локальный сервер разработки и / или apache, в зависимости от того, разрабатываете ли вы приложение локально или непосредственно на сервере. Изменения в ваших файлах кода вступят в силу только после повторной компиляции, которая происходит, когда файл импортируется или вызывается напрямую. Если вы не перезагрузили сервер, возможно, файл не был перекомпилирован, и, следовательно, изменения могли не произойти.

Я уверен, что вы написали свою модель в файле моделей, а фильтры для администратора - в файле admin.py?

...