Сбой проверки CSRF при отправке после рендеринга шаблона через Ajax до - PullRequest
0 голосов
/ 17 октября 2019

У меня есть большой набор форм модели с начальными данными, который вводится с помощью ajax через отдельный визуализированный шаблон. Я также передаю токен csrf в шаблон. В инспекторе также видно, что скрытый ввод csrf выглядит точно так же, как и другие формы на той же странице. Однако, если я хочу отправить форму, я все равно получаю сообщение об ошибке csrf.

Таким образом, весь интерфейс работает, а маркер отображается в шаблоне, только я не могу отправить форму и не могуНе знаю, почему

Я уже пытался отрисовать форму без ввода и внедрить ввод через Ajax, но результат был таким же.

views.py, который вызывается запросом ajax POST

def render_revolver_table_form(request, product_id, production_step):
    context = {}
    context['csrfmiddlewaretoken'] = request.POST.dict()['csrfmiddlewaretoken']
    template = 'products/product_details/setup_revolver_table.html'

    SetupRevolverMapFormSet = modelformset_factory(SetupRevolverMap, exclude=(
        'product', 'production_step', 'kanal', 'id'), form=SetupRevolverMapForm)
    setup_revolver_maps = SetupRevolverMap.objects.filter(
        product=product_id, production_step=production_step).all()
    context['formset'] = SetupRevolverMapFormSet(
        queryset=setup_revolver_maps.filter(kanal=1))

    return render(request, template, context)

внедренный шаблон

<table class="table">
   <thead class="thead-dark">
      <tr>
         <!-- Here is content from the formset -->
      </tr>
   </thead>
   <form id="setup_revolver_form_kanal_1" action="" method="POST">
      <input type="hidden" name="csrfmiddlewaretoken" value={{csrfmiddlewaretoken}}" />
      {{ formset.management_form  }}
      <tbody>
         <!-- Here is content from the formset -->
      </tbody>
   </form>
</table>

ajax.js

csrftoken = $('input[name="csrfmiddlewaretoken"]').val()
$.ajax({
    url: 'ajax',
    type: 'POST',
    data: {
        csrfmiddlewaretoken: csrftoken
    },
    success: function (data) {
        $('#setup_revolver').append(data))
    }
});

template.html

 <!-- other forms etc. -->
 <div id="setup_revolver">
...