【问题标题】:Django Listview pagination; Page is paginated correctly but page_obj not working in templateDjango Listview 分页;页面已正确分页,但 page_obj 在模板中不起作用
【发布时间】:2021-02-14 18:30:42
【问题描述】:

我是 Django 新手,正在尝试将基于函数的视图重构为 CBV。 我得到了其他一切工作,并且分页工作(它在每个页面上显示“JOBS_PER_PAGE”作业),但唯一的问题是在模板中,page_obj 不起作用。尽管该页面有下一页,但页面导航器全部变灰并禁用。 page_obj.number 不返回任何内容。我查看了其他帖子,但找不到任何有用的信息。

为了让 page_obj 在模板中正常工作,我需要做任何额外的步骤吗?

urls.py

urlpatterns = [
    path('', views.landing_page, name='landing-page'),
    path('search/<int:pk>/', views.SearchView.as_view(), name='search'),
    path('apply/<int:pk>/', views.apply, name='apply'),
    path('result/<int:pk>/', views.result, name='result'),
    path('start/', views.start, name='start'),
    path('eor/<int:pk>', views.end_of_round, name='end-of-round'),
    path('closing/<int:pk>', views.closing, name='closing')
]

views.py

class SearchView(ListView):
    model = Job
    context_object_name = 'jobs'
    template_name = 'simulation/search.html'
    paginate_by = JOBS_PER_PAGE

    def setup(self, request, *args, **kwargs):
        super().setup(request, *args, **kwargs)
        self.respondent = Respondent.objects.get(pk=self.kwargs['pk'])
        if self.respondent.is_out_of_money():
            self.respondent.increment_round()
            self.respondent.save()
            return redirect('simulation:end-of-round', pk=self.respondent.id)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['respondent'] = self.respondent
        return context

    def post(self, request, *args, **kwargs):
        self.respondent.subtract_from_balance(request.POST.get('more_info_fee'))
        self.respondent.add_to_jobs_more_info(request.POST.get('selected_job'))
        self.respondent.log_time_spent()
        self.respondent.increment_stage()
        self.respondent.save()
        return redirect('simulation:search', pk=self.respondent.id)

搜索.html

{% if is_paginated %}
  <nav aria-label="...">
    <ul class="pagination">
      {% if page_obj.has_previous %}
        <li class="page-item">
          <a class="page-link" href="?page={{ page_obj.previous_page_number }}">Previous</a>
        </li>
        <li class="page-item">
          <a class="page-link" href="?page={{ page_obj.previous_page_number }}">{{ page_obj.previous_page_number }}</a>
        </li>
      {% else %}
        <li class="page-item disabled">
          <a class="page-link" href="#" tabindex="-1" aria-disabled="true">Previous</a>
        </li>
      {% endif %}
      <li class="page-item">
        <a class="page-link" href="?page={{ page_obj.number }}">{{ page_obj.number }}</a>
      </li>
      {% if jobs.has_next %}
        <li class="page-item">
          <a class="page-link" href="?page={{ page_obj.next_page_number }}">{{ page_obj.next_page_number }}</a>
        </li>
        <li class="page-item">
          <a class="page-link" href="?page={{ page_obj.next_page_number }}">Next</a>
        </li>
      {% else %}
        <li class="page-item disabled">
          <a class="page-link" href="#" tabindex="-1" aria-disabled="true">Next</a>
        </li>
      {% endif %}
    </ul>
  </nav>
{% endif %}

编辑: 模板search.html 的结构为

{% block A %}
{% endblock A %}

CODE ABOVE

{% block B %}
{% endblock B %}

page_obj 可以在块 A 和块 B 中访问,但不能在块之间访问。

  [1]: https://i.stack.imgur.com/jr7Dx.png

【问题讨论】:

  • JOBS_PER_PAGE的值是多少?
  • JOBS_PER_PAGE 是 2,数据库中有 3 个Jobs,它在第 1 页显示 2。如果我在 URL 中手动输入 ?page=2,它会显示第三个作业.所以一切都是正确的,但是 page_obj :/

标签: django


【解决方案1】:

问题是我的模板是嵌套的,并且分页代码在search.html 继承的另一个模板中重复。

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多