Хранение фильтров в Django Admin - PullRequest
       18

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

5 голосов
/ 07 октября 2008

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

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

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

Ответы [ 7 ]

3 голосов
/ 08 октября 2008

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

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

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

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

Посмотрите здесь и здесь примеры людей, пишущих свои собственные.

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

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

2 голосов
/ 07 октября 2008

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

1 голос
/ 15 апреля 2010

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

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

# 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, чтобы после нажатия пользователем кнопки save они возвращались в список со значением поля фильтра, добавленным к 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
0 голосов
/ 23 апреля 2014

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

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

0 голосов
/ 29 февраля 2012

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

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

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

0 голосов
/ 02 февраля 2012

По моему мнению, лучше переопределить методы из 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

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

0 голосов
/ 03 июня 2010

Еще один способ сделать это - встроить фильтр в набор запросов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...