10

我对我遇到的问题感到非常困惑,我希望有人能指出我的错误。

我在 views.py 中有一个方法,它绑定到其中包含表单的模板。代码如下所示:

def template_conf(request, temp_id):
    template = ScanTemplate.objects.get(id=int(temp_id))
    if request.method == 'GET':
        logging.debug('in get method of arachni.template_conf')    
        temp_form = ScanTemplateForm(instance=template))
        return render_response(request, 'arachni/web_scan_template_config.html', 
                               {
                                'template': template,
                                'form': temp_form,
                               })
    elif request.method == 'POST':
        logging.debug('In post method')
        form = ScanTemplateForm(request.POST or None, instance=template)
        if form.is_valid():
            logging.debug('form is valid')
            form.save()
            return HttpResponseRedirect('/web_template_conf/%s/' %temp_id)

这个页面的行为是这样的:当我按下“提交”按钮时,程序进入POST分支,并成功执行了分支中的所有内容。然后HttpResponseRedirect唯一重定向到当前页面(那个url是当前url,我认为应该等于.)。自从我重定向到当前页面后,该GET分支被执行,并且页面确实返回成功。但是,如果我此时刷新页面,浏览器会返回确认警告:

The page that you're looking for used information that you entered. 
Returning to that page might cause any action you took to be repeated. 
Do you want to continue?

如果我确认,帖子数据将再次发布到后端。似乎浏览器仍在保存以前的 POST 数据。我不知道为什么会出现这种情况,请帮忙。谢谢。

4

2 回答 2

7

看起来您在 Chrome 25 中遇到了一个错误(请参阅Chromium 问题 177855),该错误处理重定向处理不正确。它已在 Chrome 26 中修复。

您的原始代码是正确的,尽管可以按照 Brandon 的建议稍微简化一下。我建议您在成功发布请求后进行 重定向,因为它可以防止用户意外重新提交数据(除非他们的浏览器有错误!)。

于 2013-03-10T15:32:24.033 回答
2

如果您的表单操作设置为“.”,则无需进行重定向。浏览器警告不在您的控制范围内,无法覆盖。您的代码可以大大简化:

# Assuming Django 1.3+
from django.shortcuts import get_object_or_404, render_to_response

def template_conf(request, temp_id):
    template = get_object_or_404(ScanTemplate, pk=temp_id)
    temp_form = ScanTemplateForm(request.POST or None, instance=template)

    if request.method == 'POST':
        if form.is_valid():
            form.save()
            # optional HttpResponseRedirect here
    return render_to_response('arachni/web_scan_template_config.html', 
           {'template': template, 'form': temp_form})

这将简单地保留您的模型并重新渲染视图。如果您想在调用 之后将 HttpResponse 重定向到不同的视图.save(),这不会导致浏览器警告您必须重新提交 POST 数据。

此外,没有必要,也不是好的做法,硬编码您将重定向到的 URL 模式。使用reversedjango.core.urlresolvers 中的方法。如果您的 URL 需要更改,它将使您的代码在以后更容易重构。

于 2013-03-08T17:01:49.360 回答