【问题标题】:How to paginate search results in Django?如何在 Django 中对搜索结果进行分页?
【发布时间】:2016-06-13 22:44:29
【问题描述】:

下面的代码在字典中搜索单词,并在search.html上呈现结果,所以我需要在该页面上对结果进行分页,我该怎么做?我在这里阅读了https://docs.djangoproject.com/en/1.9/topics/pagination/ 的文章,但我不知道如何将分页代码嵌入到我的中。

def search(request):
    if 'results' in request.GET and request.GET['results']:
        results = request.GET['results']
        word = words.objects.filter(title__icontains = results).order_by('title')
        return render_to_response('myapp/search.html',
        {'word': word, 'query': results })
    else:
        return render(request, 'myapp/search.html')

【问题讨论】:

  • 你尝试了什么?该文档有一个使用 [视图中的分页器](docs.djangoproject.com/en/1.9/topics/pagination/… 的示例。该示例是对查询集 contact_list 进行分页,您只需对查询集进行分页 word
  • 顺便说一句,如果您将模型命名为Word(大写,单数),将您的查询集命名为words(可能有多个结果)并使用到处都是render 而不是render_to_response
  • 感谢您的建议,我是 Python/Django 的新手,还有很多东西要学。

标签: python django pagination


【解决方案1】:
from django.core.paginator import Paginator

def search(request):
    if 'results' in request.GET and request.GET['results']:
        page = request.GET.get('page', 1)

        results = request.GET['results']
        word = words.objects.filter(title__icontains = results).order_by('title')
        paginator = Paginator(word, 25) # Show 25 contacts per page
        word = paginator.page(page)
        return render_to_response('myapp/search.html',
                 {'word': word, 'query': results })
    else:
        return render(request, 'myapp/search.html')

【讨论】:

  • 哇,谢谢!但我想现在我的模板代码有问题......我应该在这里改变什么? {% if word %} <p class="words_len">Words found: {{ word|length }}.</p> <ul> {% for words in word %} <li class="listofwords"><a class="foundword" href="{% url 'translations' words.id %}">{{ words.title }}</a> </li> {% endfor %} </ul> {% elif word == None %} <p id="error_message">You left the form empty</p> {% else %} <p id="error_message">Nothing found</p> {% endif %}
  • 有什么问题?
  • 现在它只是找不到任何单词并显示错误消息“您将表单留空”
  • 将模板代码包装在 {% if word.num_pages
【解决方案2】:

当我需要对查询的数据进行分页并覆盖 query_set 函数时,我更喜欢使用 ListView 类。像这样的...

class FoodMenuView(generic.ListView):
    paginate_by = 10 #use your paginated  value here
    template_name = 'order/_food_menu.html' # your own template
    context_object_name = "list_of_food"

    def get_queryset(self):
        return Food.objects.filter(price=request.GET['price'])

【讨论】:

  • 尽管我喜欢 CBV,但这对我不起作用。我还使用itertools 并通过queryset = sorted(chain(...)) 合并多个请求的结果
  • 我们需要在get_queryset方法中使用self.request来访问变量request
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2015-04-05
相关资源
最近更新 更多