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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:41:12