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
相关产品推荐
相关产品推荐

