Вопрос

Чего я хотел бы достичь, так это:

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

Нажать 2 раза "Назад"?

Для этого есть простой способ, но это не общее решение и требует изменения каждого 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 метод, так что после того, как пользователь нажмет Сохранить, они возвращаются в представление списка со значением поля фильтра, добавленным к 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top