Django实现剧集帖子评论功能的技术求助
Django剧集评论功能实现方案
问题描述
我想在Django的剧集(episode)帖子里实现评论功能,查了很多文档但要么不适用要么跑不起来。需要做独立的评论添加和查看功能,还要在帖子模板里展示。附上现有的Model、Form、View、URL和模板代码,求简洁优雅的解决方案。
现有代码
模型(models.py)
class season(models.Model): slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG')) ... def __str__(self): return self.slug def get_absolute_url(self): return reverse('seasonpost', kwargs={'seasonpost_slug': self.slug, 'episodepost_slug': self.slug}) class episode(models.Model): slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('SLUG')) ... cat = models.ForeignKey('season', on_delete=models.PROTECT, null=True) def __str__(self): return self.slug def get_absolute_url(self): return reverse('episodepost', kwargs={'seasonpost_slug': self.slug, 'episodepost_slug': self.slug}) class Comment(models.Model): post = models.ForeignKey(episode,on_delete=models.CASCADE, related_name='comments') name = models.CharField(max_length=80) email = models.EmailField() body = models.TextField() created_on = models.DateTimeField(auto_now_add=True) active = models.BooleanField(default=False) class Meta: ordering = ['created_on'] def __str__(self): return 'Comment {} by {}'.format(self.body, self.name)
表单(forms.py)
from .models import Comment from django import forms class CommentForm(forms.ModelForm): class Meta: model = Comment fields = ('name', 'body')
视图(views.py)
from .forms import * from .models import * ... def ContentSeason(request, seasonpost_slug): seasonpages = get_list_or_404(season, slug=seasonpost_slug) homepages=home.objects.all() seasonspages=seasons.objects.all() season_menu=season.objects.all() episodepost = episode.objects.filter() seasonpages=season.objects.filter(slug=seasonpost_slug) return render(request, 'content/season.html',{ 'season':seasonpages, 'episode': episodepost,}) def ContentEpisode(request, seasonpost_slug, episodepost_slug): episodepost = episode.objects.filter(slug=episodepost_slug, cat__slug=seasonpost_slug) current_episode = get_object_or_404(episodepost, slug=episodepost_slug, cat__slug=seasonpost_slug) previous_episode = episode.objects.filter(cat__slug=seasonpost_slug, pk__lt=current_episode.pk).first() next_episode = episode.objects.filter(cat__slug=seasonpost_slug, pk__gt=current_episode.pk).first() return render(request, 'content/episode.html', { 'episode': episodepost, 'current_episode': current_episode, 'previous_episode': previous_episode, 'next_episode': next_episode, })
URL配置(urls.py)
path('', views.ContentHome, name='homepage'), path('seasons', views.ContentSeasons), path('seasons/<slug:seasonpost_slug>', views.ContentSeason, name='episode-detail'), path('seasons/<slug:seasonpost_slug>/<slug:episodepost_slug>', views.ContentEpisode, name='episode-detail'),
模板(episode.html)
<div class="contaiter__b"> <h3>Comments</h3> </div>
解决方案
1. 修复表单缩进问题
你的CommentForm中Meta类的缩进错误已修正,确保model和fields处于Meta的缩进层级下。
2. 修改ContentEpisode视图,处理评论逻辑
更新视图以支持评论提交和展示已审核的评论:
def ContentEpisode(request, seasonpost_slug, episodepost_slug): # 获取当前剧集 current_episode = get_object_or_404(episode, slug=episodepost_slug, cat__slug=seasonpost_slug) # 获取上下集 previous_episode = episode.objects.filter(cat__slug=seasonpost_slug, pk__lt=current_episode.pk).first() next_episode = episode.objects.filter(cat__slug=seasonpost_slug, pk__gt=current_episode.pk).first() # 获取已激活的评论 comments = current_episode.comments.filter(active=True).order_by('created_on') # 处理评论提交 if request.method == 'POST': comment_form = CommentForm(data=request.POST) if comment_form.is_valid(): new_comment = comment_form.save(commit=False) new_comment.post = current_episode new_comment.email = request.POST.get('email', '') new_comment.save() # 提交后重定向避免重复提交 return redirect(current_episode.get_absolute_url()) else: comment_form = CommentForm() return render(request, 'content/episode.html', { 'current_episode': current_episode, 'previous_episode': previous_episode, 'next_episode': next_episode, 'comments': comments, 'comment_form': comment_form, })
3. 修正URL的重复name问题
两个URL使用了相同的name='episode-detail'会导致反向解析错误,修改为:
path('', views.ContentHome, name='homepage'), path('seasons', views.ContentSeasons), path('seasons/<slug:seasonpost_slug>', views.ContentSeason, name='season-detail'), path('seasons/<slug:seasonpost_slug>/<slug:episodepost_slug>', views.ContentEpisode, name='episode-detail'),
同时修正模型的get_absolute_url方法:
- season模型:
def get_absolute_url(self): return reverse('season-detail', kwargs={'seasonpost_slug': self.slug})
- episode模型:
def get_absolute_url(self): return reverse('episode-detail', kwargs={'seasonpost_slug': self.cat.slug, 'episodepost_slug': self.slug})
4. 更新episode模板,展示评论和表单
修改模板添加评论列表和提交表单:
<div class="contaiter__b"> <h3>评论区</h3> <!-- 评论列表 --> {% if comments %} <div class="comments-list"> {% for comment in comments %} <div class="comment-item"> <p class="comment-author">{{ comment.name }} 于 {{ comment.created_on|date:"Y-m-d H:i" }} 发表</p> <p class="comment-body">{{ comment.body }}</p> </div> {% endfor %} </div> {% else %} <p>暂无评论,快来抢沙发!</p> {% endif %} <!-- 评论提交表单 --> <div class="comment-form"> <h4>发表评论</h4> <form method="POST"> {% csrf_token %} {{ comment_form.as_p }} <div class="form-group"> <label for="id_email">邮箱(不会公开):</label> <input type="email" name="email" id="id_email" required> </div> <button type="submit" class="btn btn-primary">提交评论</button> </form> </div> </div>
如果不需要用户输入邮箱,可在CommentForm中移除email字段,并在视图中设置默认值(如从登录用户信息获取)。
5. 可选:添加评论审核后台
在admin中注册Comment模型,方便手动审核评论:
from django.contrib import admin from .models import Comment admin.site.register(Comment)
只有active=True的评论会在前端展示。
内容的提问来源于stack exchange,提问作者Yurko
相关产品推荐
相关产品推荐

