Django 6中文教程

14.3 核心功能开发(二):评论与用户交互

Django6个人博客系统教程:评论功能开发详解

Django 6中文教程

本教程详细介绍如何使用Django6开发个人博客系统的评论功能,包括评论模型定义、提交功能实现、评论列表展示与嵌套评论,以及用户登录权限控制,确保未登录用户无法评论,适合新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django6个人博客系统教程:评论与用户交互功能开发

引言

在个人博客系统中,评论功能是用户互动的重要组成部分。本教程将基于Django6,详细讲解如何实现评论功能,包括模型定义、提交、列表展示、嵌套评论以及登录权限控制。适合Django初学者,教程内容简单易懂,步骤清晰。

1. 评论模型定义

首先,我们需要定义评论模型(Model)。在Django中,模型用于表示数据库表结构。以下是一个基本的评论模型示例:

# blog/models.py
from django.db import models
from django.contrib.auth.models import User
from blog.models import Post  # 假设有一个博客文章模型

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')  # 关联到博客文章
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments')  # 关联到用户
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='replies')  # 用于嵌套评论
    content = models.TextField()  # 评论内容
    created_at = models.DateTimeField(auto_now_add=True)  # 创建时间
    updated_at = models.DateTimeField(auto_now=True)  # 更新时间

    class Meta:
        ordering = ['created_at']  # 默认按创建时间排序

    def __str__(self):
        return f"评论 by {self.author} on {self.post.title}"

解释:

  • 使用ForeignKey关联博客文章和用户模型,支持级联删除。
  • parent字段允许创建嵌套评论(即回复功能),设置为ForeignKey到自身,表示评论可以回复其他评论。
  • 字段如content存储评论文本,时间字段自动管理。
  • Meta类定义默认排序。

2. 评论提交功能

接下来,实现评论提交功能。这涉及创建视图(View)和表单(Form)。

2.1 创建评论表单

在Django中,可以使用ModelForm简化表单创建:

# blog/forms.py
from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content', 'parent']  # 只允许用户输入内容和父评论ID
        widgets = {
            'content': forms.Textarea(attrs={'rows': 3, 'placeholder': '输入评论...'}),
        }

2.2 创建提交视图

在视图中,处理表单提交和保存:

# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required  # 用于权限控制
from .models import Post, Comment
from .forms import CommentForm

@login_required  # 确保只有登录用户才能评论
def add_comment(request, post_id):
    post = get_object_or_404(Post, id=post_id)  # 获取博客文章
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user  # 设置评论作者为当前用户
            comment.save()
            return redirect('post_detail', post_id=post_id)  # 重定向到文章详情页
    else:
        form = CommentForm()
    return render(request, 'blog/post_detail.html', {'form': form, 'post': post})

解释:

  • 使用@login_required装饰器,确保未登录用户无法访问此视图,实现权限控制。
  • 表单验证后,保存评论时关联文章和用户。
  • 重定向到文章详情页以显示评论。

3. 评论列表展示与嵌套评论

在文章详情页,我们需要显示评论列表,并支持嵌套评论。

3.1 更新视图以传递评论数据

在文章详情视图中,查询评论并传递给模板:

# blog/views.py
def post_detail(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    comments = post.comments.filter(parent=None).order_by('created_at')  # 获取顶级评论(无父评论)
    form = CommentForm() if request.user.is_authenticated else None  # 仅登录用户显示表单
    return render(request, 'blog/post_detail.html', {'post': post, 'comments': comments, 'form': form})

3.2 在模板中显示评论列表

使用模板递归处理嵌套评论:

<!-- blog/templates/blog/post_detail.html -->
<h2>评论列表</h2>
<ul>
{% for comment in comments %}
    <li>
        <strong>{{ comment.author.username }}</strong> 在 {{ comment.created_at }} 说:
        <p>{{ comment.content }}</p>
        <!-- 显示回复按钮和嵌套评论 -->
        <a href="#" onclick="showReplyForm({{ comment.id }})">回复</a>
        {% if comment.replies.all %}
            <ul>
                {% include 'blog/comment.html' with comments=comment.replies.all %}
            </ul>
        {% endif %}
    </li>
{% empty %}
    <li>暂无评论</li>
{% endfor %}
</ul>

<!-- 评论表单 -->
{% if user.is_authenticated %}
    <h3>发表评论</h3>
    <form method="post" action="{% url 'add_comment' post.id %}">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="hidden" name="parent" id="parent_id" value="">  <!-- 用于存储父评论ID -->
        <button type="submit">提交评论</button>
    </form>
{% else %}
    <p>请<a href="{% url 'login' %}">登录</a>后发表评论。</p>
{% endif %}

<script>
function showReplyForm(commentId) {
    document.getElementById('parent_id').value = commentId;  // 设置父评论ID
    alert('准备回复评论 ' + commentId);  // 可以扩展为显示表单
}
</script>

解释:

  • 使用{% include %}递归显示嵌套评论,创建comment.html模板片段处理子评论。
  • 通过JavaScript简单处理回复功能,实际中可以优化表单显示。
  • 检查用户认证状态,未登录时显示提示信息。

4. 用户登录权限控制

权限控制已通过@login_required装饰器和模板中的user.is_authenticated实现。确保在设置中配置登录URL:

# 在settings.py中添加
LOGIN_URL = '/login/'  # 指定登录页面URL

总结:本教程涵盖了Django6中个人博客系统评论功能的完整开发流程,从模型定义到前端展示,并强调了权限控制的重要性。继续学习更多Django功能,以增强博客系统。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包