在我的页面上,所有博客文章都将显示。所以我想实现下一个/上一个按钮来改善我的页面。
def PostLists(request):
num = request.session.get('num',-5)
request.session['num'] = num
num = num + 5
exp = Post.objects.order_by('-date').all()[num:(num+5)]
context = {
'object_list': exp
}
if (request.user.is_authenticated):
return render(request, 'dashboard/postlist.html', context=context)
else:
return redirect('login')
我在html代码中添加了一个next按钮,它将把我重定向到与上述相同的views.py函数,变量(num)将增加5,从而向我展示我的下5个帖子。但是,这似乎不起作用,因为我总是看到相同的5条帖子。
是否有更好的方法来实现下一个/上一个按钮?如果可以的话,请您指定?非常感谢!
答案 0 :(得分:5)
我认为您尝试自己做太多事情。 Django对此提供了支持,在呈现列表以及强制用户登录时,甚至还提供了很多支持。
我们可以为此使用基于的视图:ListView
:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
class PostListView(LoginRequiredMixin, ListView):
model = Post
template_name = 'dashboard/postlist.html'
paginate_by = 5
queryset = Post.objects.order_by('-date')
在您的dashboard/postlist.html
模板中,您可以添加逻辑以呈现按钮。例如:
<!-- render the list -->
{% if is_paginated %}
{% if page_obj.has_previous %}
<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>
{% endif %}
{% endif %}
然后,您可以在urls.py
中使用PostListView.as_view()
代替PostLists
。因此ListView
将在此处处理身份验证检查,切片,分页等。