我有一个Django应用程序,可以显示使用Django内置管理界面创建的帖子。这些帖子使用django-taggit(https://django-taggit.readthedocs.io/en/latest/)合并了标签
主页(home.html
)被设置为显示帖子和标签,当点击标签时,它会将您带到一个页面(tag_posts.html
),其中包含所有标记的帖子,例如。如果我点击一个带有“苹果”标签的帖子,我会看到一个页面,显示所有带有“苹果”标签的帖子。主页按预期工作,home.html
的分页也是如此。
问题:当查看标记的帖子列表时,它显示了paginate_by
指定的帖子数量(在代码中为2),但没有显示单击下一个/上一个或页码的选项。
我所做的一切:
- 我以为这可能是HTML文件中的Bootstrap导航链接,但我使用的是与我的home.html相同的链接,它可以正常工作。
- 我重构了我的基于类的视图,将标记作为上下文的一部分,并将其作为上下文变量提供给html
- 使用基本的html作为导航链接
问题出在TagPostsView
以下是我的view.py:
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse
from django.views.generic import ListView, TemplateView
from .models import Session, PostsInSession
from django.core.paginator import Paginator
from taggit.models import Tag
class PostView(ListView):
queryset = Session.objects.prefetch_related('postsinsession_set').all()
context_object_name = 'sessions'
template_name = 'home.html'
paginate_by = 2 # Number of items per page
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tags = Tag.objects.order_by('name')
paginator = Paginator(self.queryset, self.paginate_by)
page = self.request.GET.get('page')
sessions = paginator.get_page(page)
context['sessions'] = sessions
context['tags'] = tags
return context
class TagPostsView(ListView):
template_name = 'tag_posts.html'
context_object_name = 'posts'
paginate_by = 2
def get_queryset(self):
tag_slug = self.get_tag_slug()
posts = PostsInSession.objects.filter(post__tags__slug=tag_slug)
return posts
def get_tag_slug(self):
return self.kwargs['tag_slug']
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tag_slug = self.get_tag_slug()
tag = get_object_or_404(Tag, slug=tag_slug)
paginator = Paginator(context['posts'], self.paginate_by)
page = self.request.GET.get('page')
paginated_posts = paginator.get_page(page)
context['tag'] = tag
context['posts'] = paginated_posts
return context
tag_posts.html:
{% extends "base.html" %}
{% load markdownify %}
{% block content %}
<div class="row">
<div class="col">
<br>
{% if tag %}
<h2>Tag: {{ tag.name }}</h2>
{% endif %}
<hr>
{% for post in posts %}
<div class="card m-3 text-center">
<div class="card-header">
{{ post.post.title }}
</div>
<div class="card-body">
{{ post.post.body|markdownify }}
</div>
</div>
{% endfor %}
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center">
{% if posts.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ posts.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% endif %}
{% for num in posts.paginator.page_range %}
{% if posts.number == num %}
<li class="page-item active" aria-current="page">
<span class="page-link">{{ num }}</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page={{ num }}">{{ num }}</a>
</li>
{% endif %}
{% endfor %}
{% if posts.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ posts.next_page_number }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
</div>
{% endblock %}
1条答案
按热度按时间thigvfpy1#
我终于找到了解决办法。
TagPostsView
的get_context_data()
中的paginator示例应该接受查询集,而不是context['posts']
。这是因为Paginator类接受查询集并拆分为页面对象(请参见:https://docs.djangoproject.com/en/4.2/topics/pagination/)。
我的原始代码是对已经分页的帖子进行分页。下面是固定代码: