【问题标题】:Pagination django分页django
【发布时间】: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


【解决方案1】:

您应该将查询存储在某处,因为每次发出分页请求时都需要它。可能有三种方法可以做到这一点:
1. 发出 Ajax 请求并将表单数据连同页码一起传递给分页请求。
2. 创建一个 cookie/会话并将您的查询存储在其中并在需要时重新使用它。
3. 创建一个 cookie/会话并将您的查询数据存储在其中并手动对数据进行切片。
就个人而言,我会推荐第一个选项,因为它比创建 cookie/会话更有意义。此外,它们的尺寸也有限。

【讨论】:

    【解决方案2】:
            <form action='' method='GET'>
            <type="search" name='query'>
            </form>
            from django.core.paginator import Paginator
            from django.shortcuts import render
            def get_query(request):
                  template='xxx,yy.html'
                  obj=A.objects.all()
                  query=request.GET.get('query',None)
                  page=request.GET.get('page',None)
                  if not page or not query:
                     page=1
                     query=''
                  obj=obj.filter(param_icontains=query)
                  paginator=Paginator(obj,3)
                  obj=paginator.page(page)
                  return render(request,templete,{'obj':obj})
    

    【讨论】:

    • 如果没有安全问题,那么你可以使用http方法作为GET。这将在页面地址字段上显示查询键值。
    猜你喜欢
    • 2021-05-23
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多