【问题标题】:list.reverse() doesn't work properly in Djangolist.reverse() 在 Django 中无法正常工作
【发布时间】:2014-01-02 00:55:01
【问题描述】:

我正在使用 Django 框架进行我的第一个项目,我决定创建一个博客,因为在网上很容易找到有关它的资料。然后,我发现了 Paginator 模块,并决定使用它。问题是,每当我添加一个帖子时,它都会进入数据库的末尾,所以我有一个博客,到目前为止,它首先显示旧帖子。

因此,我决定使用 .reverse(),如下所示:

def index(request):
    posts = Post.objects.all()
    posts.reverse()
    paginator = Paginator(posts, 2)

    try:
        page = int(request.GET.get("page", "1"))
    except ValueError:
        page = 1

    try:
        posts = paginator.page(page)
    except (InvalidPage, EmptyPage):
        posts = paginator.page(paginator.num_pages)

    return render_to_response('index.html', {
                                             'Posts': posts,
                                             'Sideposts': Sidepost.objects.all(),
                                             })

唯一的问题是,这不起作用,至少对 Paginator 不起作用。当我停止使用 Paginator 时,它可以工作,否则就不行。

我认为这是一种非常奇怪的行为,我环顾四周,但找不到任何可以帮助我解决这个问题的东西。我做错什么了吗?

【问题讨论】:

    标签: python django pagination blogs


    【解决方案1】:

    让数据库进行排序:

    posts = Post.objects.all().order_by('-id')
    

    当然,最好使用日期字段之类的。

    【讨论】:

    • 这样更好,因为它允许分页只加载页面所需的内容。投射到列表会加载查询中的所有内容。
    【解决方案2】:

    首先,Post.objects.all() 不返回列表对象,而是返回查询集对象。

    并且reverse 方法不会改变查询集本身,而是返回查询集的反转版本。

    如果需要列表对象,请将其转换为列表 posts = list(Post.objects.all()) 以使用 reverse 方法。

    也许以下更可取:

    posts = Post.objects.all().reverse()
    

    【讨论】:

    • 如果没有reverse方法,是不是问题执行失败了?
    • 成功了,谢谢!至于第二部分,由于我想按时间对帖子进行排序,并且每次添加新帖子都会进入数据库的末尾,所以 .reverse() 不应该足以满足我的目的吗?
    • @thefourtheye,你是对的。我更新了答案。感谢您的评论。
    • @AugustoQ,我更新了答案。我对reverse 方法的初步回答是错误的。 Queryset.reverse 返回新的查询集,而不是更改查询集本身,这与 list.reverse 不同。
    • @falsetru,您的第一个答案确实有效。这个现在我以前试过,但没有。 - 当我输入posts = Post.objects.all().reverse() 时,没有任何反应,就像我将它们分开放置时一样。当我使用posts = list(Post.objects.all()) 然后posts.reverse() 时,它工作得很好。
    猜你喜欢
    • 2023-02-16
    • 2013-10-21
    • 2014-03-07
    • 2013-02-25
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多