用户有一个 change_list ,其查询集由 URL 参数、过滤器设置或搜索参数过滤,例如:
本地主机:8000/admin/books/book/?publisher_id _exact =1
从表单返回以添加或更改记录时,过滤器将丢失。
有什么直接的方法可以保持这种状态吗?
用户有一个 change_list ,其查询集由 URL 参数、过滤器设置或搜索参数过滤,例如:
本地主机:8000/admin/books/book/?publisher_id _exact =1
从表单返回以添加或更改记录时,过滤器将丢失。
有什么直接的方法可以保持这种状态吗?
将您的查询字符串保存在会话中。将“保存和过滤”按钮添加到您的更改视图。将 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)
我没有测试这些示例片段。但将此技术用于其他响应更改。威奇奏效了。这应该让你开始。但如果你发现错误,我想知道。我会更新答案。
快乐编码!