Django使用CSRF令牌向views.py发送POST请求,然后重定向页面

Django使用CSRF令牌向views.py发送POST请求,然后重定向页面,django,django-views,braintree,django-csrf,csrf-token,Django,Django Views,Braintree,Django Csrf,Csrf Token,我最初有一个对视图的AJAX调用,然后我意识到我不能返回render(请求'my/new/template.html,context) 因此,我提出了一个相关的问题,这使我得出以下结论: 然而,我很难让CSRF令牌正常工作,它给了我一个403错误。作为补充说明,我也在使用shell_plus来使用安全连接,但我认为这并不是问题的原因 下面是我对view函数的调用: submitForm.addEventListener('submit', function (e) { const fo

我最初有一个对视图的AJAX调用,然后我意识到我不能
返回render(请求'my/new/template.html,context)

因此,我提出了一个相关的问题,这使我得出以下结论:

然而,我很难让CSRF令牌正常工作,它给了我一个403错误。作为补充说明,我也在使用shell_plus来使用安全连接,但我认为这并不是问题的原因

下面是我对view函数的调用:

submitForm.addEventListener('submit', function (e) {

    const form = new FormData(e.target);
    // const csrf_token = form.get("csrfmiddlewaretoken");
    // instead using var csrf_token = {{ csrf_token }} in template
    e.preventDefault()
    instance.requestPaymentMethod(function (err, payload) {
      var url = '/shop/payment/';
      var newForm = '<form action="' + url + '" method="post">';
      newForm += '<input type="hidden" name="csrf_token" value="' + csrf_token +'" />'
      newForm += '<input type="hidden" name="paymentMethodNonce" value="' + payload.nonce + '" />'
      newForm += '<input type="hidden" name="orderTotal" value="' + order_total + '" />'
      newForm += '<input type="hidden" name="address" value="' + $('#address-select').val() + '" />
      newForm += '<input type="hidden" name="first-name" value="' + form.get("first-name") + '" />'
      newForm += '<input type="hidden" name="last-name" value="' + form.get("last-name") + '" />'
      newForm += '</form>'
      var form_element = $(newForm);
      $('body').append(form_element);
      form_element.submit();
    });

我通过使用带有method=“post”的常规表单解决了这个问题:


我通过使用带有method=“post”的常规表单解决了这个问题:

$.ajax({
        type: 'POST',
        url: '/shop/payment/',
        headers: { "X-CSRFToken": csrf_token },
        data: {
            'paymentMethodNonce': payload.nonce,
            'orderTotal': order_total,
            'address': $('#address-select').val(),
            'first-name': form.get("first-name"),
            'last-name': form.get("last-name")
        }
}).done(function (result) {
     console.log(result.result)
    // WON'T REDIRECT
});
<form id="braintree-submit-form" method="post" action="{% url 'shop:payment' %}">
{% csrf_token %}
{# added any inputs I could get from the template here, for example #}
<input type="text" name="first-name" class="form-control" value="{{ request.user.first_name}}" required />
{# ... #}
submitForm.addEventListener('submit', function (e) {

    e.preventDefault()

    instance.requestPaymentMethod(function (err, payload) {

        var nonceInput = document.createElement("input")
        nonceInput.setAttribute('name', 'paymentMethodNonce')
        nonceInput.setAttribute('value', payload.nonce)
        nonceInput.setAttribute('type', 'hidden')
        submitForm.appendChild(nonceInput)

        var addrInput = document.createElement("input")
        addrInput.setAttribute('name', 'address')
        addrInput.setAttribute('value', $('#address-select').val())
        addrInput.setAttribute('type', 'hidden')
        submitForm.appendChild(addrInput)

        submitForm.submit()
    })