Django中提交表单自动生成新ID的问题求助
问题分析与解决方案
问题根源
你的代码核心问题是硬编码了pk=1,并且错误地将修改旧评论的逻辑前置,直接导致了两个问题:
- 不带
pk=1提交时,ActionReview.objects.get(user__id=request.user.id, game_name__id=game_id, pk=1)会尝试匹配同时满足用户、游戏且主键为1的记录,一旦该用户对该游戏存在其他评论,就会触发MultipleObjectsReturned错误。 - 带
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
相关产品推荐
相关产品推荐

