【问题标题】:Pagination in Django not working as expectedDjango中的分页没有按预期工作
【发布时间】:2018-02-13 17:20:54
【问题描述】:

我想为所有可用的课程分页,这很容易实现。但是现在我被卡住了,因为我也想要为院系分页,这将显示所访问学院的具体课程。我有 4 个模型:院系、系、研究和课程。分页也会显示院系,但问题是如果我尝试转到第二页,它会将我重定向到所有课程列表的第二页。或者,如果我更改所有课程的页面,然后尝试访问某个学院,则该学院中根本不会显示任何课程。

def index(request):
    course_list = Course.objects.all()
    page = request.GET.get('page', 1)
    paginator = Paginator(course_list, 1)
    try:
        courses = paginator.page(page)
    except PageNotAnInteger:
        courses = paginator.page(1)
    except EmptyPage:
        courses = paginator.page(paginator.num_pages)
    faculty_list = Faculty.objects.all()
    page = request.GET.get('page2', 1)
    paginator = Paginator(faculty_list, 1)
    try:
        faculties = paginator.page(page)
    except PageNotAnInteger:
        faculties = paginator.page(1)
    except EmptyPage:
        faculties = paginator.page(paginator.num_pages)
    context = {'courses': courses,
               'faculties': faculties,
               'departments': Department.objects.all(),
               'studies': StudyProgramme.objects.all(),
               'teachers': Teacher.objects.all()
               }
    return render(request, 'courses/index.html', context)

<div id="crs">
    <h3>All courses</h3>
    <ul>
        {% for course in courses %}
            <li><a href={{ course.slug }}>{{ course.name }}</a></li>
        {% endfor %}
    </ul>
    <div class="pagination">
        <span class="step-links">
            {% if courses.has_previous %}
                <a href="?page=1">&laquo; first</a>
                <a href="?page={{ courses.previous_page_number }}">{{ courses.previous_page_number }}</a>
            {% endif %}
            <span class="current">
                Page {{ courses.number }} of {{ courses.paginator.num_pages }}
            </span>
            {% if courses.has_next %}
                <a href="?page={{ courses.next_page_number }}">{{ courses.next_page_number }}</a>
                <a href="?page={{ courses.paginator.num_pages }}">last &raquo;</a>

            {% endif %}
        </span>
    </div>
</div>
{% for faculty in faculties %}
    <div id="fac_{{ faculty.pk }}_tab" style="display:none;">
        <h3> {{ faculty.name }} Courses</h3>
        <ul>
            {% for department in faculty.department_set.all %}
                {% for study in studies %}
                    {% if study.department == department %}
                        {% for course in courses %}
                            {% if course.study_programme == study %}
                                <li>
                                    <a class="first" href={{ course.slug }}>{{ course.name }}</a>
                                </li>
                            {% endif %}
                        {% endfor %}
                    {% endif %}
                {% endfor %}
            {% endfor %}
        </ul>
        <div class="pagination">
            <span class="step-links">
                {% if faculties.has_previous %}
                    <a href="?page2=1">&laquo; first</a>
                    <a href="?page2={{ faculties.previous_page_number }}">{{ faculties.previous_page_number }}</a>
                {% endif %}
                <span class="current">
                    Page {{ faculties.number }} of {{ faculties.paginator.num_pages }}
                </span>
                {% if faculties.has_next %}
                    <a href="?page2={{ faculties.next_page_number }}">{{ faculties.next_page_number }}</a>
                    <a href="?page2={{ faculties.paginator.num_pages }}">last &raquo;</a>
                {% endif %}
            </span>
        </div>
    </div>
{% endfor %}

【问题讨论】:

    标签: python django django-pagination


    【解决方案1】:

    这不是 Django 问题,您的视图肯定是处理一个分页参数page,它将指向课程,因此如果您更改每个模型分页的 get 参数,它将起作用。

    例如:

    ## views.py
    page = request.GET.get('page')
    ## yourtemplate.html
    <a href="?page={{ yourcontext }}">yourtext</a>
    localhost:8000/MYVIEW/?page=2  # Goes to courses
    
    ## views.py    
    page = request.GET.get('faculties')
    ## yourtemplate.html
    <a href="?faculties={{ yourcontext }}">yourtext</a>
    ##
    localhost:8000/MYVIEW/?faculties=2 # Goes to faculties
    

    等等。

    编辑:

    {% for Faculty in faculties %} 将其更改为 {% for Faculty in faculties2 %} 并从您的上下文中删除 faculties,因为您在重复自己作为 faculties2 并且各学院持有相同的查询集。

    【讨论】:

    • 我尝试过类似的方法。我没有成功。请看这里:pastebin.com/mk1QTfd7
    • 请在问题本身中分享您的 sn-p,因为它将对其他人有所帮助。
    • 您的上下文不正确,您的模板调用分页遵循相同的方式,因此当您调用分页对象时,它不会返回结果,因为您没有在查询集中使用它循环。
    • {% for Faculty in faculties %} 将其更改为 {% for Faculty in faculties2 %} 并从您的上下文中删除 faculties,因为您正在重复自己作为 faculties2 并且 faculties 拥有相同的查询集,但 faculties 没有't 具有不会转到下一页的分页对象。
    • 我重新编辑了上面的 sn-p。另外,如果我现在按照您刚才提到的那样做.. 没有什么可以正常工作了。
    【解决方案2】:

    paginator = Paginator(course_list, 1)

    paginator = Paginator(faculty_list, 1)

    将您的第二个实例名称更改为 paginator_two 将解决您的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2020-08-04
      • 2021-09-23
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多