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

Django中提交表单自动生成新ID的问题求助

问题分析与解决方案

问题根源

你的代码核心问题是硬编码了pk=1,并且错误地将修改旧评论的逻辑前置,直接导致了两个问题:

  1. 不带pk=1提交时,ActionReview.objects.get(user__id=request.user.id, game_name__id=game_id, pk=1)会尝试匹配同时满足用户、游戏且主键为1的记录,一旦该用户对该游戏存在其他评论,就会触发MultipleObjectsReturned错误。
  2. 带pk=1提交时,代码只会固定修改这条主键为1的记录,完全不会执行新增逻辑。

针对「每次提交都创建新评论」的修改代码

既然需求是每次提交都生成新评论记录,直接移除修改旧评论的逻辑,保留纯新增流程即可,同时修正代码里的字段赋值错误:

def submit_review(request, game_id):
    url = request.META.get('HTTP_REFERER')
    if request.method == 'POST':
        form = Game_ReviewForm(request.POST)
        if form.is_valid():
            # 创建实例但暂不保存,手动补充外键字段
            new_review = form.save(commit=False)
            new_review.game_id = game_id
            new_review.user_id = request.user.id
            new_review.save()
            messages.success(request, '感谢您的评价!您的评论已成功提交。')
            return redirect(url)
    # GET请求或表单验证失败时返回原页面
    return redirect(url)

改动说明

  • 移除了多余的try-except修改逻辑,完全聚焦新增评论的需求。
  • 使用form.save(commit=False)简化实例创建流程,避免手动逐个赋值字段的冗余操作。
  • 修正了原代码中data.user__id的错误写法,外键的ID字段应使用user_id(双下划线__是ORM查询时的关联语法,不能直接用于字段赋值)。
  • 流程更简洁,所有合法的POST请求都会生成新的评论记录,符合你的需求。

额外补充:如果之后需要支持「用户对同一游戏只能有一条评论,提交时更新」

若后续需求变更,需要用户对同一游戏的评论唯一,提交时更新旧评论而非新增,可修改为如下代码(去掉硬编码的pk=1,按用户+游戏维度查找):

def submit_review(request, game_id):
    url = request.META.get('HTTP_REFERER')
    if request.method == 'POST':
        try:
            # 查找该用户对当前游戏的已有评论
            review = ActionReview.objects.get(user_id=request.user.id, game_name_id=game_id)
            form = Game_ReviewForm(request.POST, instance=review)
            msg = '感谢您的评价!您的评论已成功更新。'
        except ActionReview.DoesNotExist:
            form = Game_ReviewForm(request.POST)
            msg = '感谢您的评价!您的评论已成功提交。'
        
        if form.is_valid():
            review = form.save(commit=False)
            review.game_id = game_id
            review.user_id = request.user.id
            review.save()
            messages.success(request, msg)
            return redirect(url)
    return redirect(url)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:31