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

