代码之家  ›  专栏  ›  技术社区  ›  trouselife

Django2:提交表单后,有没有更好的方法来“擦除”帖子以停止重新提交

  •  0
  • trouselife  · 技术社区  · 6 年前

    我有一个django应用程序,在一个页面上,我有几个不同型号的表格。我想一个'成功'的消息,这是很容易做到的只是添加到上下文后,表单提交/验证。然而,这就留下了重新提交表单的可能性,这只会产生一个返回页面的错误,但它仍然让我恼火。

    网址:

     url_patterns = [
          re_path(r'^manager/$', Manager.as_view(), name='manager'),
    
          .......more.....
     ]
    

    视图.py:

    class Manager(LoginRequiredMixin, View):
    
        template_name = 'results/manager_templates/manager.html'
        form1 = Form1
        form2 = Form2
    
        login_url = '/'
        redirect_field_name = 'redirect_to'
    
    
        def get(self, request, *args, **kwargs):
    
            form1 = self.form1()
            form2 = self.form2()
    
            context = {
                    'form1': form1,
                    'form2': form,}
    
            return render(request, self.template_name, context)
    
    
        def post(self, request, *args, **kwargs):
    
            submit_clicked = request.POST.get('submit')
    
            form1 = self.form1()
            form2 = self.form2()
    
            context = {}
    
            if submit_clicked == 'Form 1':
    
                form1 = self.form1(request.POST)
    
                if form1.is_valid():
                    form1.save()
    
                    context['message'] = 'Form 1 successful'
    
                    # reset the form
                    form1 = self.form1()
    
                    # return HttpResponseRedirect(
                    #            reverse('results:manager',
                    #        ))
    
    
                else:
                    print('NOT VALID')
    
    
            elif submit_clicked == 'Form 2':
    
                 ... do same stuff as above ...
    
    
            context['form1'] = form1
            context['form2'] = form2
    
            return render(request, self.template_name, context)
    

    如果我取消对HttpResponseRedirect out的注释,那么在验证并添加表单之后,如下所示:

                   return HttpResponseRedirect(
                               reverse('results:manager',
                          ))
    

    i、 e如果我要写:

                   return HttpResponseRedirect(
                               reverse('results:manager',
                               kwargs={'success':'success'}
                          ))
    

    Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 1 pattern(s) tried: ['manager/$']
    

    如果我改变了网址.py收件人:

     url_patterns = [
            re_path(r'^manager/$', Manager.as_view(), name='manager'),
            re_path(r'^manager/(?P<success>)$', Manager.as_view(), name='manager'),
    
     ] 
    

    我得到一个错误:

     Reverse for 'manager' with keyword arguments '{'success': 'success'}' not found. 2 pattern(s) tried: ['manager/(?P<success>)$', 'manager/$']
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alasdair    6 年前

    正如您所发现的,您应该在成功发布后重定向,以防止重复请求。

    success 组。

    re_path(r'^manager/(?P<success>\w+)$', Manager.as_view(), name='manager'),
    

    /manager/?success=success ,则可以从 request.GET

    您还可以在会话中存储数据,或者使用 messages framework .