diff --git a/src/DjangoBlog/comments/forms.py b/src/DjangoBlog/comments/forms.py index 2ca5aa2..108bdbd 100644 --- a/src/DjangoBlog/comments/forms.py +++ b/src/DjangoBlog/comments/forms.py @@ -1,4 +1,7 @@ +#zyl: # comments/forms.py +# Django 表单定义文件:用于处理评论的创建和验证 + from django import forms from django.forms import ModelForm from django.core.exceptions import ValidationError @@ -7,23 +10,71 @@ from .models import Comment class CommentForm(ModelForm): + """ + 评论表单类 + 用于处理用户提交的评论内容,包括主评论和回复评论 + + 功能特性: + - 验证评论内容的长度和格式 + - 处理嵌套评论(回复功能) + - 与 Comment 模型直接绑定 + """ + + # 隐藏输入字段:用于存储父评论的 ID(当用户回复某个评论时) + # required=False 表示这是可选字段(主评论没有父评论) + # 在模板中需要手动渲染此字段,或通过 JavaScript 动态赋值 parent_comment_id = forms.IntegerField( - widget=forms.HiddenInput, required=False) + widget=forms.HiddenInput, # 使用隐藏输入框,不显示给用户 + required=False # 允许为空(顶级评论无需父评论) + ) class Meta: - model = Comment - fields = ['body'] + """ + 表单元数据配置 + """ + model = Comment # 指定关联的模型为 Comment + fields = ['body'] # 只包含 body 字段(评论内容) + # 其他字段(如 author、article)将在视图中自动赋值 def clean_body(self): - """验证评论内容""" + """ + 自定义验证方法:验证评论内容(body 字段) + Django 表单会自动调用以 clean_ 命名的方法来验证特定字段 + + 验证规则: + 1. 去除首尾空白字符 + 2. 最小长度限制(5个字符) + 3. 最大长度限制(300个字符,与模型定义保持一致) + + 返回: + str: 验证通过并清理后的评论内容 + + 抛出: + ValidationError: 当验证失败时抛出异常,错误信息将显示在表单中 + """ + + # 从已清理的数据中获取 body 内容,并去除首尾空白 body = self.cleaned_data.get('body').strip() + + # 定义长度限制常量 min_length = 5 - max_length = 300 # 与模型中保持一致 + max_length = 300 # 必须与 Comment 模型中 body 字段的 max_length 保持一致 - # 字数限制验证 + # 验证:检查最小长度 if len(body) < min_length: raise ValidationError(f"评论内容不能少于{min_length}个字符") + + # 验证:检查最大长度 if len(body) > max_length: raise ValidationError(f"评论内容不能超过{max_length}个字符") - return body \ No newline at end of file + # 返回清理后的数据(Django 要求 clean_ 方法必须返回处理后的值) + return body + +# 使用示例(在视图中): +# form = CommentForm(request.POST) +# if form.is_valid(): +# comment = form.save(commit=False) +# comment.author = request.user # 自动填充作者 +# comment.article = article # 自动填充文章 +# comment.save() \ No newline at end of file