使用表单输入重定向到Django中的URL的正确方法

时间:2017-02-28 13:13:52

标签: python django

我设法从HTML表单获取值到URL模式,但它不是解决问题的优雅方式。所以我想问最好的办法是什么,因为我再次面临同样的问题。

以下是我所拥有的简化版本:

我的 HTML表单

<form method='post' action={% url 'pressed_button' %}>
  <button name="choice" value="Correct-Button"> Click Me </button>
  <button name="choice" value="Wrong-Button"> Dont Click Me </button>
</form>

这是我的 urls.py

url(r'^PressedButton/$', views.PressedButtonView.as_view(), name='pressed_button'),
url(r'^PressedButton/(?P<choice>\w+)$', views.PressedButtonView.as_view(), name='pressed_button_with_user_choice'),

和视图类 PressedButtonView

class PressedButtonView(View):
    def get(self, request, choice):
        return render(request, 'weirdapp/buttonclicked.html', {'button': choice})

    def post(self, request):
        choice = request.POST['choice']

        return redirect(reverse('pressed_button_with_user_choice', kwargs={'choice': choice}))

现在,我想如果我可以在表单的“action”属性中发送按下按钮的值

<form method='post' action={% url 'pressed_button_with_user_choice' 'pressedButtonValue' %}>

这将是一个更好的代码。

另外,如果我可以得到我的次要但相关问题的答案,return redirect(reverse())中的反向方法有什么作用?为什么不直接重定向到URL模式名称?

感谢。

3 个答案:

答案 0 :(得分:0)

为什么不为每个按钮制作适当action的单独表格?

答案 1 :(得分:0)

我可以建议一种替代方法吗?在表格post之后验证正确/不正确的选择可能会更好吗?在form_valid中,您可以根据正确/错误的选择重定向到另一个页面?

换句话说,如果你在HTML class=Correct-choice中添加提示,你可能会得到一些骗子:P

答案 2 :(得分:0)

一段时间后,我回来回答自己的问题,因为我想到了一个好的解决方案。

使用Javascript,我们可以使用从按下的按钮获得的值,将表单数据的POST请求发送到所需的url。方法如下:

HTML:

<form id="my-form">
 Age: <input name="age" value="31"/>
</form>

<button class="form-submitter" data-choice="Correct-Button"> Click Me </button>
<button class="form-submitter" data-choice="Wrong-Button"> Dont Click Me </button>

Javascript:

(function(){
  $('.form-submitter').on('click', function(e){
    let formData = new FormData(document.getElementById('my-form'));
    let buttonChoice = $(this).data('choice');

    $.ajax({
      url: '/PressedButton/ + buttonChoice',
      data: formData,
      method: 'POST',
      processData: false,
      contentType: false,
      success: function(response){
        console.log("successful communication", response);
      },
    });

  });  
})();

urls.py:

url(r'^PressedButton/(?P<choice>\w+)$', views.PressedButtonView.as_view(), name='pressed_button'),

在视图类 PressedButtonView中:

class PressedButtonView(View):
    def post(self, request, choice):
        #age = request.POST['age']
        return render(request, 'weirdapp/buttonclicked.html', {'button': choice})

这是javascript工作的更多文献JSFiddle。 JSFiddle