首页 > 解决方案 > 如何加载到 Django Paginator 页面(下一个/上一个)?

问题描述

嗨,我按照教程进行了多模型搜索,并且效果很好。现在我想对输出进行分页。但是如何将分页器页面(下一个/上一个)数据加载到我的模板中?到目前为止,如果我按下下一个,我会得到一个错误。

视图.py

from django.views.generic import TemplateView, ListView
from django.views.generic import View
from django.shortcuts import render
from django.db.models import Q
from django.core.paginator import Paginator
from itertools import chain

# --- Import Models
from datainput.models import Animal
from datainput.models import Farmer

<....>

class SearchView(ListView):
    template_name = 'farmapi/searchview.html'
    paginate_by = 2
    count = 0

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['count'] = self.count or 0
        context['query'] = self.request.GET.get('q')
        return context

    def get_queryset(self):
        request = self.request
        query = request.GET.get('q', None)

        if query is not None:
            farmer_results        = Farmer.objects.search(query)
            animal_results      = Animal.objects.search(query)


        # combine querysets 
            queryset_chain = chain(
                    farmer_results,
                    animal_results
            )        
            qs = sorted(queryset_chain, 
                    key=lambda instance: instance.pk, 
                    reverse=True)
            self.count = len(qs) # since qs is actually a list
            return qs

        return Farmer.objects.none() # just an empty queryset as default

模板.html

{% extends 'base.html' %}
{% load class_name %}
{% load static %}

{% block custom_css %}
<link rel="stylesheet" type="text/css" href="{% static 'css/home_styles.css' %}">
{% endblock %}

{% block content %}
<div style="height: 10px;">
</div>
<div class="container-fluid">
    <div class='row'>
        <div class="col-4 offset-md-8">
            <form method='GET' class='' action='.'>
                <div class="input-group form-group-no-border mx-auto" style="margin-bottom: 0px; font-size: 32px;">
                    <span class="input-group-addon cfe-nav" style='color:#000'>
                        <i class="fa fa-search" aria-hidden="true"></i>
                    </span>
                    <input type="text" name="q" data-toggle="popover" data-placement="bottom" data-content="Press enter to search" class="form-control cfe-nav mt-0 py-3" placeholder="Search..." value="" style="" data-original-title="" title="" autofocus="autofocus">
                </div>
            </form>
        </div>
    </div>
</div>

<div style="height: 10px;">
</div>

<div class="container-fluid">
    <div class="row">
        <div class="col-6 offset-md-4">
            {% for object in object_list %}
            {% with object|class_name as klass %}
            {% if klass == 'Farmer' %}
            <div class='row'>
                Farmer: <a href='{{ object.get_absolute_url }}'> {{ object.first_name }} {{ object.last_name }}</a>
            </div>
            {% elif klass == 'Animal' %}
            <div class='row'>
                Animal: <a href='{{ object.get_absolute_url }}'> {{ object.name }} {{ object.species }}</a>
            </div>
            {% else %}
            <div class='row'>
                <a href='{{ object.get_absolute_url }}'>{{ object }} | {{ object|class_name }}</a>
            </div>
            {% endif %}

            {% endwith %}

            {% empty %}

            {% endfor %}
            <div style="height: 10px;">
            </div>
            <div class='row'>
                <results>{{ count }} results for <b>{{ query }}</b></results>
            </div>
        </div>
    </div>
</div>

<div class="container-fluid">
    <!-- Pagniator Data -->
    <div class="paginator">
        <span class="step-links">

            <span class="current">
                Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
            </span>

            {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
            {% endif %}



            {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
            {% endif %}

        </span>
    </div>

</div>
    {% endblock %}

如果我的模板显示例如“xyz 的 4 个结果”“第 1 页,共 2 页”并且我推送下一页最后一页,那么我会收到以下错误消息:

找不到页面 (404) 请求方法:GET 请求 URL: http: //127.0.0.1 :8000/data/searchview/?page=2 提出者:farmapi.views.SearchView

无效页面 (2):该页面不包含任何结果

所以据我了解,我必须明确分页我的查询集的返回,以便分页器将其放入?还是我错过了为分页器设置请求?

标签: djangodjango-templatesdjango-views

解决方案


我还使用分页器,其中每页的项目数可以由用户定义。我添加了以下方法:

def get_paginate_by(self, queryset):
    limit = int(self.request.POST.get('limit', 25))

    return limit

在模板中它看起来像:

{% if is_paginated %}
     {{ page_obj|render_paginator }}
{% endif %}

render_paginator 模板标签在哪里。在您的模板中调用如下网址:your_url?page=2


推荐阅读