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

基于Django搭建博客:从零实现评论功能的视图函数问询

嘿,我来帮你把这个Django博客的评论功能完整落地!从你给出的视图代码来看,已经迈出了关键一步,咱们一步步把剩下的环节补全,从零到整实现它:

从零实现Django博客评论功能

1. 先搞定评论模型(models.py)

首先得有存储评论的模型,在你的博客app的models.py里添加这个:

from django.db import models
from django.contrib.auth.models import User

class Topic(models.Model):
    # 假设你的Topic模型已经有这些字段(根据你的代码推测)
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    content = models.TextField()
    # 其他已有字段...

class Comment(models.Model):
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='comments')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']  # 新评论排在前面

    def __str__(self):
        return f'Comment by {self.created_by.username} on {self.topic.title}'

这里的related_name='comments'是为了方便从Topic实例直接获取所有评论(比如topic.comments.all())。

2. 创建评论表单(forms.py)

在app目录下新建forms.py,定义评论表单:

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content']  # 只需要用户输入评论内容
        widgets = {
            'content': forms.Textarea(attrs={'rows': 3, 'placeholder': '写下你的评论...'}),
        }
        labels = {
            'content': '',  # 去掉表单字段的标签
        }

3. 完善你的视图函数(views.py)

把你写的视图补全,主要是添加评论列表的查询,以及修正redirect的参数:

from django.shortcuts import get_object_or_404, redirect, render
from django.contrib.auth.decorators import login_required  # 可选:如果要强制登录才能评论
from .models import Topic, Comment
from .forms import CommentForm

def topic_detail(request, slug):
    topic = get_object_or_404(Topic, slug=slug)
    # 获取当前话题的所有评论,按时间倒序
    comments = topic.comments.all()
    form = CommentForm()

    if request.method == 'POST':
        # 检查用户是否登录(你已经写了这部分,没问题)
        if request.user.is_authenticated:
            form = CommentForm(request.POST)
            if form.is_valid():
                comment = form.save(commit=False)
                comment.topic = topic
                comment.created_by = request.user
                comment.save()
                # 修正redirect的参数,跳回当前话题详情页
                return redirect('board:topic_detail', slug=topic.slug)
        # 如果用户未登录,可以在这里加提示,比如跳转到登录页
        else:
            return redirect('login')  # 假设你有登录页面的URL名称

    # 把话题、评论、表单都传给模板
    context = {
        'topic': topic,
        'comments': comments,
        'form': form,
    }
    return render(request, 'board/topic_detail.html', context)

如果想强制用户登录才能评论,还可以给视图加上@login_required装饰器,这样就不用自己判断request.user.is_authenticated了。

4. 配置URL路由(urls.py)

确保你的app的urls.py里有对应的路由:

from django.urls import path
from . import views

app_name = 'board'

urlpatterns = [
    # 其他路由...
    path('topic/<slug:slug>/', views.topic_detail, name='topic_detail'),
]

5. 在模板中渲染评论区(templates/board/topic_detail.html)

最后在话题详情模板里添加评论展示和表单的HTML:

<!-- 先展示话题内容 -->
<h1>{{ topic.title }}</h1>
<p>{{ topic.content }}</p>

<!-- 评论区 -->
<div class="comments-section">
    <h3>评论区 ({{ comments.count }})</h3>

    <!-- 展示已有评论 -->
    {% for comment in comments %}
    <div class="comment">
        <p><strong>{{ comment.created_by.username }}</strong> · {{ comment.created_at|date:"Y-m-d H:i" }}</p>
        <p>{{ comment.content }}</p>
    </div>
    {% empty %}
    <p>还没有评论,快来抢沙发吧!</p>
    {% endfor %}

    <!-- 评论表单 -->
    <div class="comment-form">
        {% if user.is_authenticated %}
        <h4>写下你的评论</h4>
        <form method="POST">
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">提交评论</button>
        </form>
        {% else %}
        <p>请<a href="{% url 'login' %}">登录</a>后发表评论</p>
        {% endif %}
    </div>
</div>

你可以根据自己的前端样式需求调整HTML结构和CSS。

这样一套下来,你的评论功能就完整跑通啦!从模型存储、表单提交、视图处理到模板渲染,全部环节都覆盖到了。

内容的提问来源于stack exchange,提问作者Phú Võ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:31