Django反馈功能遇ValidationError,需实现用户ID捕获与脏话过滤
问题修复与功能实现方案
一、解决ValidationError错误
你的代码存在变量名错误、逻辑错误,这是触发ValidationError的核心原因,以下是修复方案:
1. 核心错误点梳理
- 视图中错误使用
is_superuser=request.user.id:is_superuser是布尔字段,不能用用户ID(整数)匹配,获取当前登录用户直接用request.user即可 - 引用不存在的模型:
FeedBackUser、FeedBack均未定义,应替换为你实际创建的FeedbackMessage feedback_save错误使用@property装饰器:视图函数无需该装饰器- 变量未定义就引用:
feedback_save中使用了未定义的user_obj,同时定义的staff_obj未实际使用
2. 修复后的views.py代码
# feedback/views.py from django.shortcuts import render, redirect from django.contrib import messages from .models import FeedbackMessage # 导入正确的模型 from accounts.models import User def feedback_view(request): # 获取当前登录用户的所有反馈记录 feedback_data = FeedbackMessage.objects.filter(user_id=request.user) context = { "feedback_data": feedback_data } return render(request, "staff_template/staff_feedback_template.html", context) def feedback_save(request): if request.method != "POST": messages.error(request, "Invalid Method.") return redirect('feedback') else: feedback = request.POST.get('feedback_message') # 直接使用当前登录用户,无需额外查询 try: add_feedback = FeedbackMessage(user_id=request.user, feedback=feedback, feedback_reply="") add_feedback.save() messages.success(request, "Feedback Sent.") return redirect('feedback') except Exception as e: messages.error(request, f"Failed to Send Feedback: {str(e)}") return redirect('feedback')
3. 模型优化建议
外键字段名user_id易与Django自动生成的数据库字段混淆,建议改为user,更符合Django规范:
# models.py from django.db import models from django.conf import settings User = settings.AUTH_USER_MODEL class FeedbackMessage(models.Model): id = models.AutoField(primary_key=True) user = models.ForeignKey(User, on_delete=models.CASCADE) # 修改字段名 feedback = models.TextField() feedback_reply = models.TextField(null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = models.Manager()
修改后,视图中user_id=request.user需同步改为user=request.user。
二、实现提交反馈仅捕获用户ID
Django外键会自动存储关联用户的ID,你只需将当前登录用户(request.user)关联到FeedbackMessage实例即可,无需手动处理ID,Django会自动在数据库中完成user_id字段的存储。
三、实现脏话过滤功能
方案1:自定义脏话列表过滤
def feedback_save(request): if request.method != "POST": messages.error(request, "Invalid Method.") return redirect('feedback') else: feedback = request.POST.get('feedback_message') # 自定义脏话列表,替换为实际需要过滤的词汇 profane_words = ["脏话1", "脏话2", "脏话3"] for word in profane_words: if word in feedback.lower(): messages.error(request, "反馈内容包含违规词汇,请修改后提交。") return redirect('feedback') try: add_feedback = FeedbackMessage(user=request.user, feedback=feedback, feedback_reply="") add_feedback.save() messages.success(request, "Feedback Sent.") return redirect('feedback') except Exception as e: messages.error(request, f"Failed to Send Feedback: {str(e)}") return redirect('feedback')
方案2:使用第三方专业库
安装better-profanity库:
pip install better-profanity
在视图中使用:
from better_profanity import profanity def feedback_save(request): if request.method != "POST": messages.error(request, "Invalid Method.") return redirect('feedback') else: feedback = request.POST.get('feedback_message') # 自动检测脏话 if profanity.contains_profanity(feedback): messages.error(request, "反馈内容包含违规词汇,请修改后提交。") return redirect('feedback') try: add_feedback = FeedbackMessage(user=request.user, feedback=feedback, feedback_reply="") add_feedback.save() messages.success(request, "Feedback Sent.") return redirect('feedback') except Exception as e: messages.error(request, f"Failed to Send Feedback: {str(e)}") return redirect('feedback')
内容的提问来源于stack exchange,提问作者ezekiel mhando
相关产品推荐
相关产品推荐

