在第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,那么让我不要让用户编辑他的代码段听起来更合乎逻辑。你能解释一下这些问题吗?
答案 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)验证这些变化。