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

Django创建表单提交后重定向至新建页面失败问题求助

问题描述

提交创建表单后无法重定向到新建页面,更新表单该功能正常。运行代码后出现 AttributeError 错误,提示'function' object has no attribute 'id'。

现有代码(views.py)

@login_required(login_url='login')
def createRoom(request):
    form = RoomForm()
    topics = Topic.objects.all()
    if request.method == 'POST':
        topic_name = request.POST.get('topic')
        topic, created = Topic.objects.get_or_create(name=topic_name)

        Room.objects.create(
            host=request.user,
            topic=topic,
            name=request.POST.get('name'),
            assigned=request.user,
            status=request.POST.get('status'),
            priority=request.POST.get('priority'),
            type=request.POST.get('type'),
            description=request.POST.get('description'),
        )
        return render('room', pk=room.id)

    context = {'form': form, 'topics': topics, 'room': room}
    return render(request, 'room/room_form.html', context)

错误信息

Traceback (most recent call last):
  File "C:\Users\mikha\issue_env\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\mikha\issue_env\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\mikha\issue_env\lib\site-packages\django\contrib\auth\decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\mikha\issuetracker\base\views.py", line 68, in createRoom
    return render('room', pk=room.id)

Exception Type: AttributeError at /create-room/
Exception Value: 'function' object has no attribute 'id'

问题原因及修复方案

  1. 变量未定义:调用 Room.objects.create() 时没有将创建的实例赋值给 room 变量,后续引用 room.id 时,room 实际指向了同名的视图函数,导致报错。
  2. render用法错误:重定向到详情页应该用 redirect 而非 render,render 用于渲染模板,redirect 才是跳转视图的正确方式。

修复后的代码:

from django.shortcuts import render, redirect  # 确保导入redirect

@login_required(login_url='login')
def createRoom(request):
    form = RoomForm()
    topics = Topic.objects.all()
    if request.method == 'POST':
        topic_name = request.POST.get('topic')
        topic, created = Topic.objects.get_or_create(name=topic_name)

        # 将创建的Room实例赋值给room变量
        room = Room.objects.create(
            host=request.user,
            topic=topic,
            name=request.POST.get('name'),
            assigned=request.user,
            status=request.POST.get('status'),
            priority=request.POST.get('priority'),
            type=request.POST.get('type'),
            description=request.POST.get('description'),
        )
        # 使用redirect跳转到room详情视图
        return redirect('room', pk=room.id)

    # 移除未定义的room变量,避免GET请求时报错
    context = {'form': form, 'topics': topics}
    return render(request, 'room/room_form.html', context)

额外说明:

  • 确保项目URL配置中存在名为'room'的路由,且该路由对应接收pk参数的详情视图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:05:18