实用的Django项目 - 第183和184页

时间:2011-05-02 13:26:15

标签: python django projects

在第183和184页上,有以下代码:

def edit_snippet(request, snippet_id):
    snippet = get_object_or_404(Snippet, pk=snippet_id)
    if request.user.id != snippet.author.id:
        return HttpResponseForbidden()
    if request.method == 'POST':
        form = SnippetForm(instance=snippet, data=request.POST)
        if form.is_valid():
            snippet = form.save()
            return HttpResponseRedirect(snippet.get_absolute_url())
    else:
        form = SnippetForm(instance=snippet)
    return render_to_response('cab/snippet_form.html',{ 'form': form, 'add': False })
edit_snippet = login_required(edit_snippet)

为什么需要在此处添加数据属性:

form = SnippetForm(instance=snippet, data=request.POST)

实例属性不够吗?

如果请求方法不是POST,那么它可以是任何东西,但通常它是一个GET方法。为什么在这种情况下没有数据属性?为什么有必要考虑其他请求方法?我们不能写:

def edit_snippet(request, snippet_id):
    snippet = get_object_or_404(Snippet, pk=snippet_id)
    if request.user.id != snippet.author.id:
        return HttpResponseForbidden()
    if request.method == 'POST':
        form = SnippetForm(instance=snippet, data=request.POST)
        if form.is_valid():
            snippet = form.save()
            return HttpResponseRedirect(snippet.get_absolute_url())
    return render_to_response('cab/snippet_form.html',{ 'form': form, 'add': False })
edit_snippet = login_required(edit_snippet)

如果请求方法不是POST,那么让我不要让用户编辑他的代码段听起来更合乎逻辑。你能解释一下这些问题吗?

2 个答案:

答案 0 :(得分:2)

这是Django的做法: 相同的视图用于显示编辑表单(GET),然后验证它(POST)。

请参阅docs中的此示例:

  

处理a的标准模式   视图中的表单如下所示:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

答案 1 :(得分:1)

“edit_snippet”函数处理(1)GET请求以显示用于编辑对象的表单,以及(2)当用户将更改保存到表单时的后续POST请求。

考虑到这一点,非POST案例只需从数据库中检索到的“片段”变量填充表单即可。如您所知,在这种情况下没有“数据”参数。数据库中的内容将显示给用户。

但是,当用户保存表单时,在POST情况下,“snippet”变量将仅保存从数据库中检索到的内容。通过将“data”参数设置为用户发布的表单字段(request.POST)的内容,您允许表单(1)将用户从request.POST编辑的内容存储到对象中,然后(2)验证这些变化。