|
|
|
|
@ -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_<fieldname> 命名的方法来验证特定字段
|
|
|
|
|
|
|
|
|
|
验证规则:
|
|
|
|
|
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
|
|
|
|
|
# 返回清理后的数据(Django 要求 clean_<field> 方法必须返回处理后的值)
|
|
|
|
|
return body
|
|
|
|
|
|
|
|
|
|
# 使用示例(在视图中):
|
|
|
|
|
# form = CommentForm(request.POST)
|
|
|
|
|
# if form.is_valid():
|
|
|
|
|
# comment = form.save(commit=False)
|
|
|
|
|
# comment.author = request.user # 自动填充作者
|
|
|
|
|
# comment.article = article # 自动填充文章
|
|
|
|
|
# comment.save()
|