添加表单返回 None 作为记录 id,导致 URL 出错
Posted
技术标签:
【中文标题】添加表单返回 None 作为记录 id,导致 URL 出错【英文标题】:Add form returns None as record id, causing URL to error 【发布时间】:2012-05-31 15:26:29 【问题描述】:我正在使用找到的代码 here (SO.com) 来使用相同的模板来添加和编辑记录,但是当我添加新记录并单击提交时,我在 URL @ 上得到一个 404 987654322@,我不确定为什么。
这是我urls.py
的相关部分:
url(r'^app/lesson/new/$', 'edit_lesson', , 'lesson_new'),
url(r'^app/lesson/edit/(?P<id>\d+)/$', 'edit_lesson', , 'lesson_edit'),
这是我views.py
的相关部分:
def edit_lesson(request, id=None, template_name='lesson_edit_template.html'):
if id:
t = "Edit"
lesson = get_object_or_404(Lesson, pk=id)
stu = get_object_or_404(Student, pk=sid)
if stu.teacher != request.user:
raise HttpResponseForbidden()
else:
t = "Add"
lesson = Lesson()
if request.POST:
form = LessonForm(request.POST, instance=lesson)
if form.is_valid():
form.save()
# If the save was successful, redirect to another page
return view_lessons(request)
else:
form = LessonForm(instance=lesson)
return render_to_response(template_name,
'form': form,
't': t,
'lesson': lesson,
, context_instance=RequestContext(request))
最后,这是我的模板:
<h1> t Lesson</h1>
<form action="/app/lesson/edit/ lesson.id /" method="post"> % csrf_token %
form.as_p
<input type="submit" value="Submit" />
</form>
我确定我错过了一些非常简单的东西,但我似乎无法找到它。如果这有什么不同,我正在使用 Django 1.3.1。
谢谢, MC
【问题讨论】:
【参考方案1】:无需在表单的 action
属性中指定任何 URL。做吧
<form action="" method="post">
它会 POST 回您最初用来访问它的 URL,这正是您想要的。
【讨论】:
【参考方案2】:在添加情况下 lesson.id
为 None,因为 lesson
未保存 Lesson()
实例,没有 pk,因此您的表单被触发到不存在的 URL。
我建议将创建和编辑视图分开并以不同的方式处理它们(或者甚至继承通用视图 - 使用新的基于类的通用视图很容易和愉快)。
另外,在任何地方都使用% url %
模板标签,而不是硬编码的网址。
【讨论】:
请不要将添加视图和编辑视图分开,除非您有充分的理由这样做。需要自定义表单的操作不是一个很好的理由,因为您可以将其留空,正如@DanielRoseman 解释的那样让它只是做一个回发。 这不仅仅是表单操作。在 topicstarter 的代码中有不同的处理例程,if id:...
用于编辑和添加案例。在视图中设置了活动页面标题!是的,他应该重复一些用于 POST 处理的东西,以便单独添加和编辑,但使用通用视图,所有这些东西都会消失。以上是关于添加表单返回 None 作为记录 id,导致 URL 出错的主要内容,如果未能解决你的问题,请参考以下文章