Сохранение фильтров в Django Admin

Я бы хотел достичь:

  • Я перехожу на сайт администратора, применяю некоторые фильтры к списку объектов
  • Я нажимаю и редактирую объект, редактирую, редактирую, нажимаю 'Сохранить'
  • Сайт переводит меня в список объектов … нефильтрованный. Я бы хотел, чтобы фильтр с шага 1 запоминался и применялся.

Есть ли простой способ сделать это?

7 Solutions collect form web for “Сохранение фильтров в Django Admin”

К сожалению, нет простого способа сделать это. Фильтрация, похоже, не сохраняется в любой переменной сеанса.

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

Если это просто одноразовый, дважды щелкните дважды или повторите фильтрацию, это самый простой способ.

Если вы собираетесь фильтровать чаще, или просто хотите узнать о взломе администратора (что довольно легко и просто), вы захотите написать FilterSpec .

Взгляните здесь и здесь на примеры людей, которые пишут свои собственные.

Действительно, действительно ужасным способом сделать это было бы отредактировать интерфейс администратора, чтобы после нажатия «Сохранить» вы перенаправлены на отфильтрованный URL. Я бы не рекомендовал это вообще, но это вариант.

Другой довольно простой способ сделать это – написать общий вид, чтобы показать ваши отфильтрованные объекты, а затем использовать формы Django для редактирования элементов оттуда. Я бы посмотрел на это, вы будете ошеломлены тем, как мало кода вы должны писать, чтобы получить простую страницу просмотра / редактирования.

Нажмите 2 раза «Назад»?

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

Первый шаг – написать собственный FilterSpec для фильтра (см. Сообщение Harley для ссылок, которые помогут), который сохраняет выбранное значение фильтра в сеансе (и удаляет его, когда он больше не нужен).

 # in cust_admin/filterspecs.py from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec class MyFilterSpec(ChoicesFilterSpec): def __init__(self, f, request, params, model, model_admin): super(MyFilterSpec, self).__init__(f, request, params, model, model_admin) if self.lookup_val is not None: request.session[self.lookup_kwarg] = self.lookup_val elif self.lookup_kwarg in request.session: del(request.session[self.lookup_kwarg]) # Register the filter with a test function which will apply it to any field # with a my_filter attribute equal to True FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'my_filter', False), MyFilterSpec)) 

Вы должны импортировать модуль, который находится где-то, например, ваш urls.py :

 # in urls.py from cust_admin import filterspecs 

Установите свойство в поле, для которого вы хотите применить фильтр, чтобы:

 # in models.py class MyModel(models.Model): my_field = Models.IntegerField(choices=MY_CHOICES) my_field.my_filter = True 

В пользовательском классе ModelAdmin переопределите метод change_view , чтобы после того, как пользователь нажимает change_view Сохранить» , они возвращаются в представление списка со значением поля фильтра, добавленным к URL-адресу.

 class MyModelAdmin(admin.ModelAdmin): def change_view(self, request, object_id, extra_context=None): result = super(MyModelAdmin, self).change_view(request, object_id, extra_context) if '_save' in request.POST: if 'my_field__exact' in request.session: result['Location'] = '/admin/myapp/mymodel/?my_field__exact=%s' \ % request.session['my_field__exact'] return result 

Другой способ сделать это – включить фильтр в набор запросов.

Вы можете динамически создавать прокси-модель с менеджером, который фильтрует то, как вы хотите, а затем вызовите admin.site.register (), чтобы создать новый администратор модели. Все ссылки будут относиться к этому виду.

По-моему, лучше переопределить методы из ModelAdmin changelist_view и change_view :

Вот так:

 class FakturaAdmin(admin.ModelAdmin): [...] def changelist_view(self, request, extra_context=None): result = super(FakturaAdmin, self).changelist_view(request, extra_context=None) request.session['qdict'] = request.GET return result def change_view(self, request, object_id, extra_context=None): result = super(FakturaAdmin, self).change_view(request, object_id, extra_context) try: result['location'] = result['location']+"?"+request.session['qdict'].urlencode() except: pass return result 

Как вы пожелаете, после сохранения объекта вы возвращаетесь к списку объектов с активными фильтрами.

В проекте Django есть запрос на изменение, запрашивающий именно эту функциональность.

Все, что ждет, чтобы его проверили, – это некоторые тесты и документация. Вы могли бы написать их и помочь всему проекту, или просто взять предложенный патч (в нижней части страницы) и попробовать его.

https://code.djangoproject.com/ticket/6903

Эта функция была добавлена ​​в Django как часть версии 1.6 и теперь включена по умолчанию. Это описано в примечаниях к выпуску :

ModelAdmin теперь сохраняет фильтры в представлении списка после создания, редактирования или удаления объекта. Можно восстановить предыдущее поведение фильтров очистки, установив для атрибута preserve_filters значение False.

  • как изменить выбор на страницах администратора - django
  • FieldError at / admin / - Неизвестное поле (ы) (добавлено_), указанное для UserProfile
  • django admin page дает мне 500 ошибок в производстве
  • Как переопределить перевод администратора django?
  • Как предварительно заполнить поля UserProfile в администраторе Django?
  • Заказ поля Many-To-Many в Django Admin
  • Почему Django не может найти мои файлы мультимедиа-администратора после того, как я покинул встроенный сервер?
  • Условное Django Middleware (или как исключить систему администратора)
  • Python - лучший язык программирования в мире.