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'
问题原因及修复方案
- 变量未定义:调用
Room.objects.create()时没有将创建的实例赋值给room变量,后续引用room.id时,room实际指向了同名的视图函数,导致报错。 - 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
相关产品推荐
相关产品推荐

