0

用户有一个 change_list ,其查询集由 URL 参数、过滤器设置或搜索参数过滤,例如:

本地主机:8000/admin/books/book/?publisher_id _exact =1

从表单返回以添加或更改记录时,过滤器将丢失。

有什么直接的方法可以保持这种状态吗?

4

2 回答 2

1

这个功能是对 Django 项目的一个请求很久了(是 5 年前开的)。

幸运的是,这种烦人的行为在后备箱中得到了修复。预计它将包含在 Django 1.6 中。

于 2013-07-22T15:01:15.987 回答
0

将您的查询字符串保存在会话中。将“保存和过滤”按钮添加到您的更改视图。将 response_change 添加到您的管理员。

将您的查询字符串保存在会话中。在项目的根目录中创建一个新文件“BasicContextProcessor.py”。它包含:

def basics(request):
     query_string = request.META['QUERY_STRING']
     if query_string:
          request.session['query_string'] = query_string
     return

您可能希望使用逻辑扩展上面的示例,以便仅在适当时存储 query_string。此外,如果您有多个带有“保存和过滤”按钮的更改视图,您应该单独保存每个模型的 query_string。否则 list_view-x 的过滤器将应用于 list_view-y。

要处理 BasicContextProcessor.basics 每个请求,请将其添加到 Settings.py 中的 TEMPLATE_CONTEXT_PROCESSORS:

TEMPLATE_CONTEXT_PROCESSORS = (
   ...
   "BasicContextProcessor.basics"
)

将“保存和过滤”按钮添加到您的更改视图。要扩展 change_form.html,请添加文件“/app_name/templates/admin/book/change_form.html”。用 jQuery 添加一个按钮:

{% extends "admin/change_form.html" %}
{% load i18n %}
{% block content %}
{{ block.super }}
<script type="text/javascript">//<![CDATA[
    (function($){
        $('<input type="submit" value="Save and filter" name="_viewfilterlist" />').prependTo('div.submit-row');
    })(django.jQuery);
//]]></script>
{% endblock %}

您还可以替换“保存”按钮以使其成为默认行为。但我喜欢给用户两种选择。

更改响应。在 admin.py BookAdmin 中添加:

def response_change(self, request, obj):
    if request.POST.has_key("_viewfilterlist"):
        msg = (_('The %(name)s "%(obj)s" was changed successfully.') %
               {'name': force_unicode(obj._meta.verbose_name),
                'obj': force_unicode(obj)})
        query_string = request.session['query_string']
        if query_string:
            self.message_user(request, msg)
            return HttpResponseRedirect("/admin/app_name/book/?%s" % query_string)
    return super(Book, self).response_change(request, obj)

我没有测试这些示例片段。但将此技术用于其他响应更改。威奇奏效了。这应该让你开始。但如果你发现错误,我想知道。我会更新答案。

快乐编码!

于 2013-05-09T11:23:45.327 回答