添加表单返回 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 出错的主要内容,如果未能解决你的问题,请参考以下文章

mybatis添加记录时返回主键id

django 的auth.authenticate返回为None

Access 使用子表单一次添加多个记录

mybatis添加记录时返回主键id

Access 2007 添加记录使用相同的表单

删除后保存记录