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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:39:59