分页在网页上不生效
Pagination not taking effect on webpage
我正在 sports.html 页面上应用分页。在 views.py 中,我使用 ListView
并使用 paginate_by = 2
,但问题是分页未在网页上生效。
页码在页面上可见,当点击这些页码时它没有显示任何错误,但所有帖子在所有页面上都可见,帖子不会除以 paginate_by 值。
谁能指出我在这里做错了什么?
views.py
class SportsList(ListView):
model = Sports
template_name = 'frontend/sports.html'
paginate_by = 2
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['main'] = Main.objects.all()
context['sports'] = Sports.objects.all()
return context
sports.html
<section class="blog_area">
<div class="container">
<div class="row">
<div class="col-lg-8">
<div class="blog_left_sidebar">
{% for sport in sports %}
<article class="row blog_item">
<div class="col-md-3">
<div class="blog_info text-right">
<ul class="blog_meta list">
<li><a href="#">XAR<i class="lnr lnr-user"></i></a></li>
<li><a href="#">From: {{ sport.from_date }}<i class="lnr lnr-calendar-full"></i></a></li>
<li><a href="#">To: {{ sport.to_date }}<i class="lnr lnr-calendar-full"></i></a></li>
<li><a href="#">{{ sport.category }}<i class="lnr lnr-layers"></i></a></li>
</ul>
</div>
</div>
<div class="col-md-9">
<div class="blog_post">
<img src="{{ sport.featured_image.url }}" alt="">
<div class="blog_details">
<a href="{% url 'sports_details' sport.slug %}">
<h2>{{ sport.title }}</h2>
</a>
<p>{{ sport.content|truncatewords:30|safe }}</p>
<a href="{% url 'sports_details' sport.slug %}" class="blog_btn">View More</a>
</div>
</div>
</div>
</article>
{% endfor %}
{% if is_paginated %}
<nav class="blog-pagination justify-content-center d-flex">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a href="?page={{ page_obj.previous_page_number }}" class="page-link">
<span aria-hidden="true">
<span class="lnr lnr-chevron-left"></span>
</span>
</a>
</li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<li class="page-item active"><a href="#" class="page-link">{{ num }}</a></li>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<li class="page-item"><a href="?page={{ num }}" class="page-link">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item">
<a href="?page={{ page_obj.next_page_number }}" class="page-link" aria-label="Next">
<span aria-hidden="true">
<span class="lnr lnr-chevron-right"></span>
</span>
</a>
</li>
{% endif %}
</ul>
{% endif %}
</nav>
</div>
</div>
</div>
</div>
</section>
这是因为您正在 get_context_data 上创建查询集。您不尊重列表视图结构。在您的视图中尝试这样的操作:
class SportsList(ListView):
queryset = Sport.objects.all()
context_object_name = “sports”
template_name = 'frontend/sports.html'
paginate_by = 2
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['main'] = Main.objects.all()
return context
您需要在 views.py.
中使用以下内容
context_object_name = 'sports'
默认情况下,当 Django 视图正在执行时,self.object_list
将包含视图正在操作的对象列表(通常,但不一定是查询集)。您可以在此处查看 Django 文档中的参考资料。
generic list view
当然,您要在 def get_context_data
的上下文中添加 'sports',但是 Django 通用列表视图需要根据 context_object_name
或 [=15] 中提到的值进行操作=].
因此在您的 views.py 中使用:
class SportsList(ListView):
model = Sports
template_name = 'frontend/sports.html'
paginate_by = 2
context_object_name = 'sports'
ordering = ["id"]
我正在 sports.html 页面上应用分页。在 views.py 中,我使用 ListView
并使用 paginate_by = 2
,但问题是分页未在网页上生效。
页码在页面上可见,当点击这些页码时它没有显示任何错误,但所有帖子在所有页面上都可见,帖子不会除以 paginate_by 值。
谁能指出我在这里做错了什么?
views.py
class SportsList(ListView):
model = Sports
template_name = 'frontend/sports.html'
paginate_by = 2
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['main'] = Main.objects.all()
context['sports'] = Sports.objects.all()
return context
sports.html
<section class="blog_area">
<div class="container">
<div class="row">
<div class="col-lg-8">
<div class="blog_left_sidebar">
{% for sport in sports %}
<article class="row blog_item">
<div class="col-md-3">
<div class="blog_info text-right">
<ul class="blog_meta list">
<li><a href="#">XAR<i class="lnr lnr-user"></i></a></li>
<li><a href="#">From: {{ sport.from_date }}<i class="lnr lnr-calendar-full"></i></a></li>
<li><a href="#">To: {{ sport.to_date }}<i class="lnr lnr-calendar-full"></i></a></li>
<li><a href="#">{{ sport.category }}<i class="lnr lnr-layers"></i></a></li>
</ul>
</div>
</div>
<div class="col-md-9">
<div class="blog_post">
<img src="{{ sport.featured_image.url }}" alt="">
<div class="blog_details">
<a href="{% url 'sports_details' sport.slug %}">
<h2>{{ sport.title }}</h2>
</a>
<p>{{ sport.content|truncatewords:30|safe }}</p>
<a href="{% url 'sports_details' sport.slug %}" class="blog_btn">View More</a>
</div>
</div>
</div>
</article>
{% endfor %}
{% if is_paginated %}
<nav class="blog-pagination justify-content-center d-flex">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a href="?page={{ page_obj.previous_page_number }}" class="page-link">
<span aria-hidden="true">
<span class="lnr lnr-chevron-left"></span>
</span>
</a>
</li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<li class="page-item active"><a href="#" class="page-link">{{ num }}</a></li>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<li class="page-item"><a href="?page={{ num }}" class="page-link">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item">
<a href="?page={{ page_obj.next_page_number }}" class="page-link" aria-label="Next">
<span aria-hidden="true">
<span class="lnr lnr-chevron-right"></span>
</span>
</a>
</li>
{% endif %}
</ul>
{% endif %}
</nav>
</div>
</div>
</div>
</div>
</section>
这是因为您正在 get_context_data 上创建查询集。您不尊重列表视图结构。在您的视图中尝试这样的操作:
class SportsList(ListView):
queryset = Sport.objects.all()
context_object_name = “sports”
template_name = 'frontend/sports.html'
paginate_by = 2
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['main'] = Main.objects.all()
return context
您需要在 views.py.
中使用以下内容 context_object_name = 'sports'
默认情况下,当 Django 视图正在执行时,self.object_list
将包含视图正在操作的对象列表(通常,但不一定是查询集)。您可以在此处查看 Django 文档中的参考资料。
generic list view
当然,您要在 def get_context_data
的上下文中添加 'sports',但是 Django 通用列表视图需要根据 context_object_name
或 [=15] 中提到的值进行操作=].
因此在您的 views.py 中使用:
class SportsList(ListView):
model = Sports
template_name = 'frontend/sports.html'
paginate_by = 2
context_object_name = 'sports'
ordering = ["id"]