Django Forum App,评论不会在用户端更新,但可以通过管理员查看
Django Forum App, comments don't update on user-side, but can be seen through admin
作为参考,以下是我的论坛应用程序中的模型:
class Forum(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('forum-detail', kwargs={'pk': self.pk})
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
forum = models.ForeignKey(Forum, on_delete=models.CASCADE)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
为了显示论坛 posts,我有一个 CBV 'ForumListView':
class ForumListView(ListView):
model = Forum
template_name = 'forum/forum.html'
context_object_name = 'forum_posts'
ordering = ['-created_at']
从这个列表中,用户可以点击任何论坛,这将引导他们进入 'forum-detail',CBV 'ForumDetailView':
class ForumDetailView(DetailView):
model = Forum
extra_context = {
'comments': Comment.objects.all().order_by('-created_at')}
这里是我从我的 Comment 模型中传递评论的地方,将与 post 一起显示。 我认为这就是评论不更新的原因,但我不太确定如何解决这个问题。
在 forum_detail.html 的模板中,这是我显示所有评论的方式:
{% for comment in comments %}
{% if comment.forum == forum %}
<div class="content-section">
<p>{{ comment.description }}</p>
<small>{{ comment.user.username }}, on {{ comment.created_at|date:"F d, Y" }}</small>
</div>
{% endif %}
{% endfor %}
请注意,如果我重新运行
,将显示新评论
python manage.py runserver
有时 新 评论会在 waiting/refreshing 页面几分钟后出现。
另外,我认为基于函数的视图可能会解决这个问题,但是我已经用 CBV 对我的整个应用程序进行了编码,并且希望有一个不涉及重新编码所有内容的修复程序!
非常感谢任何帮助,如果需要,可以提供更多info/code!
像这样将它放在 extra_context
中将导致在定义视图时对查询集进行求值,并且它当时具有的任何值将是视图将获得的唯一值。这就是为什么它在您重新启动服务器时起作用的原因。所以它应该是动态的,每次有新请求时都会获取。在这种情况下,您需要将其放入 get_context_data
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.all().order_by('-created_at')}
return context
作为参考,以下是我的论坛应用程序中的模型:
class Forum(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('forum-detail', kwargs={'pk': self.pk})
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
forum = models.ForeignKey(Forum, on_delete=models.CASCADE)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
为了显示论坛 posts,我有一个 CBV 'ForumListView':
class ForumListView(ListView):
model = Forum
template_name = 'forum/forum.html'
context_object_name = 'forum_posts'
ordering = ['-created_at']
从这个列表中,用户可以点击任何论坛,这将引导他们进入 'forum-detail',CBV 'ForumDetailView':
class ForumDetailView(DetailView):
model = Forum
extra_context = {
'comments': Comment.objects.all().order_by('-created_at')}
这里是我从我的 Comment 模型中传递评论的地方,将与 post 一起显示。 我认为这就是评论不更新的原因,但我不太确定如何解决这个问题。
在 forum_detail.html 的模板中,这是我显示所有评论的方式:
{% for comment in comments %}
{% if comment.forum == forum %}
<div class="content-section">
<p>{{ comment.description }}</p>
<small>{{ comment.user.username }}, on {{ comment.created_at|date:"F d, Y" }}</small>
</div>
{% endif %}
{% endfor %}
请注意,如果我重新运行
,将显示新评论python manage.py runserver
有时 新 评论会在 waiting/refreshing 页面几分钟后出现。
另外,我认为基于函数的视图可能会解决这个问题,但是我已经用 CBV 对我的整个应用程序进行了编码,并且希望有一个不涉及重新编码所有内容的修复程序!
非常感谢任何帮助,如果需要,可以提供更多info/code!
像这样将它放在 extra_context
中将导致在定义视图时对查询集进行求值,并且它当时具有的任何值将是视图将获得的唯一值。这就是为什么它在您重新启动服务器时起作用的原因。所以它应该是动态的,每次有新请求时都会获取。在这种情况下,您需要将其放入 get_context_data
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.all().order_by('-created_at')}
return context