通过Ajax渲染模板后,CSRF验证提交失败

时间:2019-10-17 11:34:07

标签: django ajax csrf

我有一个带有初始数据的大型模型表单集,该表单集由ajax通过单独的渲染模板注入。我还将csrf令牌传递给模板。在检查器中,您还可以看到csrf隐藏输入看起来与同一页上的其他表单完全一样。但是,如果我要提交表单,仍然会遇到csrf错误。

因此完整的界面有效,令牌也被渲染到模板中,只有我不能提交表单,我也不知道为什么

我已经尝试过在没有输入的情况下呈现表单,并通过Ajax注入输入,但是结果是相同的。

由ajax POST请求调用的

views.py

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">

0 个答案:

没有答案