You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中ordering=['-date_posted']排序失效,报FieldError求助

解决Django PostListView按发布日期排序触发FieldError的问题

错误原因

你碰到的FieldError本质很简单:你的post模型里没有定义date_posted字段,Django在数据库里找不到这个字段,自然无法执行排序操作。从错误提示里的可选字段列表也能看出来,只有author、author_id、body、id、title这几个字段可用。

解决方案

有两种可行的解决思路,根据你的需求选择:

方案1:添加发布日期字段(推荐)

直接给post模型新增date_posted字段,让它自动记录文章创建时间,这样后续排序、展示发布时间都更灵活。

修改你的post模型代码:

from django.db import models
from django.contrib.auth.models import User

class post(models.Model):
    title = models.CharField(max_length=50)  # 注意:max_length参数值应为整数,原代码的字符串"50"会报错
    body = models.CharField(max_length=1000000)
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    date_posted = models.DateTimeField(auto_now_add=True)  # 新增字段,auto_now_add=True表示创建时自动填充当前时间

    def __str__(self):
        return f"{self.title}"

修改完成后,执行数据库迁移命令,让变更生效:

python manage.py makemigrations
python manage.py migrate

这时候视图里的ordering=['-date_posted']就能正常工作,实现按发布日期倒序排序。

方案2:利用现有字段替代排序

如果暂时不想新增字段,可以用模型已有的id字段替代(因为Django默认的自增id是按创建顺序递增的,倒序后效果和按发布日期倒序一致)。

修改PostListView的ordering配置:

class PostListView(ListView):
    model = post 
    template_name = 'website/welcome.html'
    context_object_name = 'posts'
    ordering = ['-id']  # 按id倒序,模拟发布日期从新到旧的排序

额外提醒

原模型代码里的max_length="50"写法错误,max_length要求传入整数类型,字符串值会导致运行时错误,记得修正为max_length=50这类整数形式。

内容的提问来源于stack exchange,提问作者Rin Hyakuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:07:10