【发布时间】:2020-05-03 12:57:04
【问题描述】:
我有一个与 index.html 相关的视图
在视图中,我有一个表单来过滤查询,还有一个表格,我把从查询中得到的元素放在里面
最近我添加了一个分页,因为有时查询可能有数千个结果。
我使用了此处显示的示例https://docs.djangoproject.com/en/1.5/topics/pagination/
如果我使用表单并进行查询,我会分页数据,但如果我点击下一步,我会丢失表单中的数据,因此查询会更改
我看到的问题是表单响应一个POST方法,但是点击“下一步”会产生一个GET方法的请求,所以当form = FilterForm(request.POST)被执行时,表单是有效的,但是是空的
谢谢
编辑:
视图示例代码
if request.method == 'POST': # If the form has been submitted...
form = FilterForm(request.POST) # A form bound to the POST data
if form.is_valid():
total_events_list = Make the Query
else:
form = FilterForm() # An unbound form
total_events_list = Make another Query
paginator = Paginator(total_events_list, PAGE_LIMIT, orphans=9)
try:
latest_events_list = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
latest_events_list = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
latest_events_list = paginator.page(paginator.num_pages)
context = {'latest_events_list': latest_events_list, 'form': form}
return render_to_response('db_interface/index.html', context, context_instance=RequestContext(request))
模板,过滤查询的表单
<p> Filter events </p>
<form action="/db_interface/" method="POST">{% csrf_token %}
FORM
<input type="submit" name ="filter" value="Submit" />
</form>
{% if latest_events_list %}
<form action="indexzip" method="POST">
{% csrf_token %}
{% for event in latest_events_list %}
SHOW DATA
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if latest_events_list.has_previous %}
<a href="?page={{ latest_events_list.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ latest_events_list.number }} of {{ latest_events_list.paginator.num_pages }}.
</span>
{% if latest_events_list.has_next %}
<a href="?page={{ latest_events_list.next_page_number }}">next</a>
{% endif %}
</span>
</div>
</form>
【问题讨论】:
-
你不能一直使用 GET 吗?我的意思是,如果它只是关于过滤,那么作为 REST 动词的 POST 无论如何都没有多大意义,因为它不会改变任何数据。见这里:cs.tut.fi/~jkorpela/forms/methods.html
-
感谢您的链接。我使用 GET 进行了测试。问题是页面现在没有加载表单上的初始值,原来的问题还在继续
-
但是您可以在视图函数/html模板中传递表单值!在分页链接中,您只需将这些过滤器值添加到查询字符串中。
-
抱歉,我不知道该怎么做:“在分页链接中,您只需将这些过滤器值添加到查询字符串中”
-
在 previous:对于“过滤器”,您可以传入最初输入的内容过滤器形式。
标签: python django pagination