Django 中有序、过滤的查询集中的下一个或上一个项目

问题描述

如何从 post_details(DetailView) 过渡到下一篇文章,以便下一篇文章上一篇文章都可用?

vievs.py

class HomeView(ListView):
    model = Post
    #queryset = Post.objects.filter(status=1)
    cats = Category.objects.all()
    template_name = 'home.html'
    #ordering = ['-post_date']
    paginate_by = 6

    def get_context_data(self,*args,**kwargs):
        cat_menu = Category.objects.all()
        context = super(HomeView,self).get_context_data(*args,**kwargs)
        context["cat_menu"] = cat_menu
        return context


class ArticleDetailView(HitCountDetailView):
    model = Post
    template_name = 'post_detail.html'
    count_hit = True


    def get_context_data(self,**kwargs):
        cat_menu = Category.objects.all()
        context = super(ArticleDetailView,**kwargs)
        
        stuff = get_object_or_404(Post,id=self.kwargs['pk'])
        total_likes = stuff.total_likes()

        context["cat_menu"] = cat_menu
        context["total_likes"] = total_likes

        return context

按日期和 ID 排序

解决方法

如果您想要基于 DateTimeField 的上一项或下一项,您可以使用 .get_previous_by_fieldname(…) [Django-doc].get_next_by_fieldname(…) [Django-doc]。因此,您可以通过以下方式获取 stuff 的上一个/下一个项目:

try:
    prev_stuff = stuff.get_previous_by_post_date()
except Stuff.DoesNotExist:
    prev_stuff = None

try:
    next_stuff = stuff.get_next_by_post_date()
except Stuff.DoesNotExist:
    next_stuff = None

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...