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

Django博客评论表单不显示问题技术求助

解决评论表单不显示的问题

看起来你的评论表单不显示主要是因为视图、路由和模板之间的逻辑没有打通,我帮你梳理几个关键问题并给出修复方案:

1. 整合评论逻辑到ArticleDetail视图

你的ArticleDetail只是单纯展示文章详情,没有传递表单和评论数据到模板,而且单独的GetComments视图也没挂载到路由里。我们可以把评论的GET/POST逻辑整合到DetailView中,这样更符合Django的CBV(类视图)用法:

修改views.py:

from django.views.generic import DetailView
from django.http import HttpResponseRedirect
from .forms import CommentForm
from .models import Articles, CommentModel

class ArticleDetail(DetailView):
    model = Articles
    template_name = 'news/post.html'

    def get_context_data(self, **kwargs):
        # 调用父类方法获取默认上下文
        context = super().get_context_data(**kwargs)
        # 添加评论表单到上下文
        context['form'] = CommentForm()
        # 添加当前文章的所有评论(后续可优化为仅当前文章的评论)
        context['comments'] = CommentModel.objects.all()
        return context

    def post(self, request, *args, **kwargs):
        # 获取当前文章对象
        self.object = self.get_object()
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            # 后续建议给CommentModel添加关联文章的外键,取消注释下面一行
            # comment.article = self.object
            comment.save()
            # 重定向回当前文章详情页
            return HttpResponseRedirect(self.get_success_url())
        # 如果表单无效,返回带错误的上下文
        context = self.get_context_data(**kwargs)
        context['form'] = form
        return self.render_to_response(context)

    def get_success_url(self):
        return self.object.get_absolute_url()

另外,给Articles模型添加get_absolute_url方法,方便重定向:
修改models.py的Articles类:

class Articles(models.Model):
    title = models.CharField(max_length=200)
    post = models.TextField()
    date = models.DateTimeField()
    img = models.ImageField(upload_to='', default="default_value")

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('article_detail', args=[str(self.pk)])

2. 修复模板中的错误

你的模板里有两个影响显示的小问题:

  • 日期变量用了articles.date,但DetailView的上下文对象是object(或小写的模型名article)
  • form的action是空的URL标签,应该指向当前文章的详情URL(或留空默认提交到当前页面)

修改post.html:

{% extends "ShapeHtml/wrapper.html" %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading">
<h1 class=" text-info">{{object.title}}</h1>
</div>
<div class="panel-body">
<p> {{object.post|safe|linebreaks}} </p>
<!-- 修复日期变量 -->
<h3 align="right" class=" text-info"> Опубликованно: {{object.date|date:"d-m-Y в H:i"}}</h3>
</div>
<h4>Comments</h4>
<!-- 修复action,留空默认提交到当前页面 -->
<form action="" method="post">
{% csrf_token %}
<!-- 显示评论列表 -->
{% if comments %}
{% for comment in comments %}
{{ comment.WhoAreYou }} <br>
{% endfor %}
{% endif %}
<!-- 用as_p渲染表单,让结构更清晰 -->
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
{% endblock %}

3. 确保路由配置正确

你的urls.py已经配置了article_detail路由,不需要额外添加GetComments的路由了,因为我们已经把评论逻辑整合到ArticleDetail中,当前路由是正确的:

urlpatterns=[
    path('', ArticlesList.as_view(), name='articles_list'),
    path('<int:pk>/', ArticleDetail.as_view(), name='article_detail'),
    path('aboutUs', views.aboutUs, name='aboutUs'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

额外优化建议

为了让评论和文章关联更合理,建议给CommentModel添加外键字段:

class CommentModel(models.Model):
    WhoAreYou = models.CharField(max_length=100)
    # 添加关联文章的外键
    article = models.ForeignKey(Articles, on_delete=models.CASCADE, related_name='comments')
    # 新增评论时间字段
    created_at = models.DateTimeField(auto_now_add=True)

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

然后在ArticleDetail的get_context_data里只获取当前文章的评论:

context['comments'] = self.object.comments.all()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:00:49