Python Django项目无法从数据库拉取数据展示在list.html页面问题求助
Django Post列表不显示问题排查
以下是代码中存在的所有问题,按影响优先级排序:
1. 模型文件缩进错误(核心问题)
你的Models.py中,Meta类、__str__方法、get_absolute_url方法的缩进层级错误,不属于Post类的内部成员,导致Django无法识别这些核心属性/方法,轻则属性调用报错,重则数据查询异常。
请调整缩进,将这三部分放到Post类内部,顺带修复默认管理器命名错误(原代码写的是object,少了s):
class Post(models.Model): # 原有字段保持不变 STATUS_CHOICES = (('draft', 'Draft'),('published','Published'),) title=models.CharField(max_length=250) slug=models.SlugField(max_length=250,unique_for_date='publish') author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='blog_posts') body = models.TextField() publish = models.DateTimeField(default=timezone.now) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) status = models.CharField(max_length=10, choices=STATUS_CHOICES,default='draft') objects = models.Manager() published = PublishedManager() # 下面这部分调整缩进,放到Post类内部 class Meta: ordering = ('-publish',) def __str__(self) : return self.title def get_absolute_url(self): return reverse("blog:post_detail", args=[self.publish.year,self.publish.month,self.publish.day,self.slug])
2. 数据状态不符合查询条件
你在视图中用Post.published.all()查询,自定义管理器只返回status='published'的文章,但Post模型的status字段默认值是draft。如果你在后台添加文章时没有手动将状态改为Published,查询结果为空,列表自然没有内容。
修复方案:
- 进入Django admin后台,将已添加的Post文章状态改为Published
- 测试阶段也可以先把视图查询代码改为
posts = Post.objects.all(),显示所有状态的文章
3. 模板变量大小写错误
你在list.html中写的是{{post.Publish}},但模型中字段名是小写的publish,Django模板变量区分大小写,该字段会显示为空。
修复:改为{{ post.publish }}
4. 不影响列表显示,但需要修复的其他问题
- 详情视图
post_detail中错用了get_list_or_404,该方法返回查询结果列表,取单篇文章应该用get_object_or_404,否则详情页会报错 - 模板中
<a>标签内多了一个多余的字符a,会导致每个标题前多显示一个a,直接删掉即可
内容的提问来源于stack exchange,提问作者Rex Honey
相关产品推荐
相关产品推荐

