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

Django视图提交评论时触发MultiValueDictKeyError问题求助

评论系统提交错误解决方案

问题根源

  1. 表单拆分导致字段缺失:HTML中将评分(rating)和评论内容(review)分别放在两个独立表单里,提交时只会发送当前表单的字段,后端无法获取另一个表单的rating值,触发MultiValueDictKeyError。
  2. JS方法拼写错误:$.ajex是拼写错误,正确写法为$.ajax,会导致AJAX请求无法正常发送。
  3. 后端无容错处理:直接使用request.POST['key']获取字段,当字段缺失时直接抛出异常,没有做容错判断。

修复步骤

1. 合并HTML表单

将评分和评论内容合并到同一个表单中,确保提交时能同时携带两个字段:

<div class="add-review">
    <h3>Add Your Review</h3>
    <form action="{% url 'core:ajex_add_review' p.id %}" method="POST" id="commentForm">
        {% csrf_token %}
        {{review_form.rating}}
        {{review_form.review}}
        <button type="submit" class="btn">Submit</button>
    </form>

    <div class="rating-bar">
        <div class="bar">
            <div class="fill" style="width: 80%;"></div>
        </div>
        <div class="bar-label"><i>{{average_rating.rating|floatformat:1}} out of 5.0</i></div>
    </div>
</div>

2. 修正JS拼写错误并添加错误处理

修正$.ajex为$.ajax,同时添加错误回调方便调试:

console.log("working");

$("#commentForm").submit(function(e){
    e.preventDefault();

    $.ajax({
        data: $(this).serialize(),
        method: $(this).attr("method"),
        url: $(this).attr("action"),
        dataType: "json",
        success: function(response){
            console.log("Comment Saved");
            // 可添加成功后的UI更新逻辑,比如刷新评论列表
        },
        error: function(xhr, status, error){
            console.error("提交失败:", error);
            console.log(xhr.responseText);
        }
    })
})

3. 优化Django视图的容错性

使用request.POST.get()方法获取字段,避免字段缺失时抛出异常,并添加基本的参数验证:

from django.db.models import Avg
from django.http import JsonResponse

def ajex_add_review(request, pid):
    if request.method != 'POST':
        return JsonResponse({'bool': False, 'error': '仅支持POST请求'}, status=400)
    
    try:
        product = Product.objects.get(pk=pid)
    except Product.DoesNotExist:
        return JsonResponse({'bool': False, 'error': '商品不存在'}, status=404)
    
    user = request.user
    if not user.is_authenticated:
        return JsonResponse({'bool': False, 'error': '请先登录'}, status=401)
    
    # 安全获取字段,设置默认值
    review_content = request.POST.get('review', '').strip()
    rating_str = request.POST.get('rating')
    
    # 验证字段有效性
    if not review_content:
        return JsonResponse({'bool': False, 'error': '评论内容不能为空'}, status=400)
    try:
        rating = int(rating_str)
        if not (1 <= rating <=5):
            raise ValueError
    except (ValueError, TypeError):
        return JsonResponse({'bool': False, 'error': '评分必须是1-5之间的整数'}, status=400)
    
    # 创建评论
    review = ProductReview.objects.create(
        user=user,
        product=product,
        review=review_content,
        rating=rating,
    )
    
    context={
        'user': user.username,
        'review': review_content,
        'rating': rating,
    }
    average_reviews = ProductReview.objects.filter(product=product).aggregate(rating=Avg("rating"))

    return JsonResponse({
        'bool': True,
        'context': context,
        'average_reviews': average_reviews,
    })

内容的提问来源于stack exchange,提问作者user22764471

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:37:04