Django点击指定用户获取其全部帖子空白无报错问题求助
问题修复方案
核心错误原因
你的问题出在模板变量引用错误和外键反向查询规则用错两个地方,Django模板默认对不存在的变量返回空值,所以不会抛错只会显示空白。
- 外键反向查询规则用错
你在Post模型里定义了指向Profile的外键,并且指定了related_name='create',这意味着你要从Profile实例查对应所有Post时,调用方式是当前profile实例.create.all(),你写的post.profile_set.all完全搞反了查询方向,而且自定义related_name后默认的_set后缀查询方式就会失效。 - 模板上下文变量错误
你用的DetailView对应模型是Profile,Django默认会把查询到的Profile实例作为上下文变量传入模板,变量名是object或者小写的模型名profile,你的模板里根本没有post这个变量,循环不存在的对象自然没有输出。
修复步骤
可选优化(推荐)
先改Post模型的related_name为更有语义的名字,避免后续混淆:
class Post(models.Model): text = models.TextField(max_length=255) # 把related_name从create改成posts,更符合语义 profile = models.ForeignKey('Profile', null=True, on_delete = models.CASCADE, related_name='posts') overview = models.CharField(max_length=255) def __str__(self): return self.text
修改后要执行makemigrations和migrate同步数据库。
修改模板代码
把原来的循环逻辑替换为以下内容即可:
{% for post in profile.posts.all %} <!-- 这里遍历你要展示的帖子字段 --> <div>{{ post.text }}</div> <div>{{ post.overview }}</div> {% empty %} <div>该用户暂无发布的帖子</div> {% endfor %}
如果你没改related_name,就把上面的profile.posts.all换成profile.create.all即可正常运行。
内容的提问来源于stack exchange,提问作者Chike Okani
相关产品推荐
相关产品推荐

