【问题标题】:i have a search function which render another page with search results and i have implemented pagination within this function but it shows me an error我有一个搜索功能,它呈现另一个带有搜索结果的页面,我已经在这个功能中实现了分页,但它显示了一个错误
【发布时间】:2021-07-13 07:39:31
【问题描述】:

我有一个名为 search_user 的视图函数,当我键入要搜索的内容时,它会显示结果,但是当我在搜索后单击下一页时,它会显示 valueerror(例如,改为返回 none)

views.py

def search_user(request):
    query = request.GET.get("q")
    context ={}
    if query:
        users = User.objects.filter(Q(username__icontains=query))
        if users:
            page = request.GET.get('page', 1)
            paginator = Paginator(users, 1)
            try:
                users = paginator.page(page)
            except PageNotAnInteger:
                users = paginator.page(1)
            except EmptyPage:
                users = paginator.page(paginator.num_pages)
            context={'users': users}
            return render(request,'user/search.html',context)
        else:
            messages.warning(request,'User matching query does not exist.')
            return redirect('acc_req_list')

表格

<form class="ml-5" action="{%url 'search_user'%}">
                    <div class="input-group input-group-sm input-group-solid" style="max-width: 175px">
                        <input type="text" class="form-control" name="q"  placeholder="Search users..." value="{{ request.GET.q }}" required />
                        <div class="input-group-append">
                            <button class="btn btn-success" type="submit">Search</button>
                        </div>
                    </div>
                </form>

搜索.html

   {% if users.has_other_pages %}
    <ul class="pagination">
      {% if users.has_previous %}
        <li class="page-item active">
            <a class="page-link" href="?page={{ users.previous_page_number }}">pre</a>
        </li>
      {% else %}
        <li class="page-item disabled"><span></span></li>
      {% endif %}
      {% for i in users.paginator.page_range %}
        {% if users.number == i %}
          <li class="page-item"><span style="z-index: 1; position: relative; display: block;padding: 0.5rem 0.75rem; margin-left: -1px; line-height: 1.25; color: #f7efef; background-color: #F64E60; border: 1px solid #E4E6EF;">{{ i }} <span class="sr-only" >(current)</span></span></li>
        {% else %}
          <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
        {% endif %}
      {% endfor %}
      {% if users.has_next %}
        <li class="page-item active">
            <a class="page-link" href="?page={{ users.next_page_number }}">Next</a>
        </li>
      {% else %}
        <li class="page-item disabled"><span></span></li>
      {% endif %}
    </ul>
{% endif %}

【问题讨论】:

  • 如果if query: 评估为False,您还没有返回任何响应...
  • 您能否解释一下如果查询结果为 False 的逻辑是什么。

标签: django pagination


【解决方案1】:

返回一些东西if query==False

def search_user(request):
    query = request.GET.get("q")
    context ={}
    if query:
        users = User.objects.filter(Q(username__icontains=query))
        if users:
            page = request.GET.get('page', 1)
            paginator = Paginator(users, 1)
            try:
                users = paginator.page(page)
            except PageNotAnInteger:
                users = paginator.page(1)
            except EmptyPage:
                users = paginator.page(paginator.num_pages)
            context={'users': users}
            return render(request,'user/search.html',context)
        else:
            messages.warning(request,'User matching query does not exist.')
            return redirect('acc_req_list')
    else:
        return redirect('URL')

更新:

search.html

通过q = {{request.GET.q}}

    {% if users.has_other_pages %}
        <ul class="pagination">
          {% if users.has_previous %}
            <li class="page-item active">               
     ➡➡➡➡<a class="page-link" href="?page={{ users.previous_page_number }}&q={{ request.GET.q }}">pre</a>
            </li>
          {% else %}
            <li class="page-item disabled"><span></span></li>
          {% endif %}
          {% for i in users.paginator.page_range %}
            {% if users.number == i %}
              <li class="page-item"><span style="z-index: 1; position: relative; display: block;padding: 0.5rem 0.75rem; margin-left: -1px; line-height: 1.25; color: #f7efef; background-color: #F64E60; border: 1px solid #E4E6EF;">{{ i }} <span class="sr-only" >(current)</span></span></li>
            {% else %}
     ➡➡➡➡<li class="page-item"><a class="page-link" href="?page={{ i }}&q={{ request.GET.q }}">{{ i }}</a></li>
            {% endif %}
          {% endfor %}
          {% if users.has_next %}
            <li class="page-item active">
     ➡➡➡➡<a class="page-link" href="?page={{ users.next_page_number }}&q={{ request.GET.q }}">Next</a>
            </li>
          {% else %}
            <li class="page-item disabled"><span></span></li>
          {% endif %}
        </ul>
    {% endif %}

【讨论】:

  • 但是如果我重定向到其他一些 url,我将如何进行分页。我需要从该结果页面进行分页
  • 你好@ZahidHassan 请看我更新的答案。它工作得很好。
  • 非常感谢..你是老板。你太棒了,我爱你,但你能解释一下你是如何得到这个逻辑的吗?
  • 非常欢迎@ZahidHassan。当您按nextprevious 链接时,您过去的查询标准。离开了。于是我想到了如何保持过去的GET查询标准?然后我应用了这个我的upd。在我过去的项目中回答,它的工作......
猜你喜欢
  • 2020-02-23
  • 1970-01-01
  • 2015-10-24
  • 2012-03-25
  • 1970-01-01
  • 2021-11-24
  • 2013-09-18
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多