【问题标题】:Django form submit again on refresh刷新时再次提交Django表单
【发布时间】:2013-01-10 03:52:40
【问题描述】:

您好,我正在制作一个简单的表格。表单提交正常,但如果我刷新页面,它会重新提交数据。似乎表单在提交后保存了数据,我假设在提交后请求方法是发布的。问题是提交后清除 Django 表单的最佳方法是什么。提交后,表单变量不应再保留这些值。谢谢

def testimonials(request, template_name="testimonials.html"):
reviews = Reviews.objects.all()
if request.method == 'POST':
    form = forms.ReviewsForm(data = request.POST)
    # create a new item

    if form.is_valid(): # All validation rules pass
        # Process the data in form.cleaned_data
        # ...
        if form.is_valid():
            nameIn = form.cleaned_data['name']
            reviewIn = form.cleaned_data['review']
            newReview = Reviews(name = nameIn, review = reviewIn)
            newReview.save()
            return render_to_response(template_name, locals(), context_instance=RequestContext(request))

else:
    # This the the first page load, display a blank form
    form = forms.ReviewsForm()

    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

【问题讨论】:

标签: python django forms


【解决方案1】:

通常,您会在处理表单/POST 请求后发出重定向(这是避免您提到的重新提交问题的常见 Web 开发实践)。因此,您可以像这样发出HttpResponseRedirect,而不是render_to_response

if form.is_valid(): 
        # Process form as desired here
        # Simple example; use reverse() to avoid hard-coding URLs
        return HttpResponseRedirect('/success/')

查看using a form in view,了解通常如何处理表单。

【讨论】:

  • 我尝试了您的解决方案并得到“视图 someview 没有返回 HttpResponse 对象。它返回了 None 。”错误,有什么想法吗?
  • 我建议发布一个新的 StackOverflow 问题而不是在这里发表评论,但您确定该表单有效吗?
【解决方案2】:

使用反向而不是渲染响应

 if form.is_valid():
        nameIn = form.cleaned_data['name']
        reviewIn = form.cleaned_data['review']
        newReview = Reviews(name = nameIn, review = reviewIn)
        newReview.save()
        return HttpResponseRedirect(reverse('app_name:url'))

【讨论】:

    【解决方案3】:

    您也可以使用“重定向”快捷方式:

    from django.shortcuts import redirect
    
    ...
    return redirect(newReview)
    

    这是假设您在评论模型中定义了 get_absolute_url。

    请参阅the docs 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多