Django csrf_token работает в одной форме, но не в другой - PullRequest
2 голосов
/ 12 марта 2019

У меня есть страница с двумя списками: для задач (tareas) и продаж (ventas).Когда вы нажимаете на их ссылки, каждая открывает свой модальный режим и получает информацию с помощью AJAX.

Один работает без проблем (tareas).Другой дает мне ошибку csrf_token.

Я подумал, что, может быть, проблема в том, чтобы использовать два токена в одном шаблоне, но я делаю это без проблем в других шаблонах.

И если я полностью удаляю часть tareas,Вентас каждый по-прежнему получает ту же ошибку.

Звонок в форме Venta

<form name="ventas_form" action="#" id="form_venta_{{operacion.comprobante}}" method="POST">
    {% csrf_token %}
    <input name="id" id="venta_id_submit" type="text" value="{{operacion.comprobante}}" hidden="true"/>
    <a style="padding-left: 1rem;" href="" id="{{operacion.comprobante}}" class="show_venta" data-toggle="modal" >{{operacion.comprobante}}</a>
</form>

Звонок в форме Tarea

<form name="form" action="#" id="form_tarea_{{tarea.id}}" method="POST">
    {% csrf_token %}
    <input name="id" id="tarea_id_submit" type="text" value="{{tarea.id}}" hidden="true"/>
    <a style="padding-left: 1rem;" href="" id="{{tarea.id}}" class="show_tarea" data-toggle="modal" >{{ tarea.titulo }}</a>
</form>

Venta Ajax

<script>
   $(function(){
        $('.show_venta').on('click', function (e) {
            e.preventDefault();
            let venta_id = $(this).attr('id');

            $.ajax({
                url:'/catalog/ventas-detail/',
                type:'POST',
                data: $('#form_venta_'+venta_id).serialize(),
                success:function(response){
                    console.log(response);
                    $('.show_venta').trigger("reset");
                    openModalVentas(response);
                },
                error:function(){
                    console.log('something went wrong here');
                },
            });
        });
    });

    function openModalVentas(venta_data){
        $('#fecha').text(venta_data.venta.fecha);
        $('#comprobante').text(venta_data.venta.comprobante);
        $('#cliente').text(venta_data.venta.cliente);
        $('#vendedor').text(venta_data.venta.vendedor);
        $('#lista').text(venta_data.venta.lista);
        $('#prod_codigo').text(venta_data.venta.prod_codigo);
        $('#prod_nombre').text(venta_data.venta.prod_nombre);
        $('#uds').text(venta_data.venta.uds);
        $('#vu').text(venta_data.venta.vu);
        $('#subtotal').text(venta_data.venta.subtotal);
        $('#bonif').text(venta_data.venta.bonif);
        $('#modal_ventas').modal('show');
    };
</script>

Tarea Ajax

<script>
   $(function(){
        $('.show_tarea').on('click', function (e) {
            e.preventDefault();
            let tarea_id = $(this).attr('id');

            $.ajax({
                url:'/catalog/tareas-detail/',
                type:'POST',
                data: $('#form_tarea_'+tarea_id).serialize(),
                success:function(response){
                    console.log(response);
                    $('.show_tarea').trigger("reset");
                    openModal(response);
                },
                error:function(){
                    console.log('something went wrong here');
                },
            });
        });
    });

    function openModal(tarea_data){
        $('#creador').text(tarea_data.tarea.creador);
        $('#destinatario').text(tarea_data.tarea.destinatario);
        $('#titulo').text(tarea_data.tarea.titulo);
        $('#tarea').text(tarea_data.tarea.tarea);
        $('#resuelto').text(tarea_data.tarea.resuelto);
        $('#fecha_creacion').text(tarea_data.tarea.fecha_creacion);
        $('#fecha_limite').text(tarea_data.tarea.fecha_limite);
        $('#fecha_resuelto').text(tarea_data.tarea.fecha_resuelto);
        $('#empresa').text(tarea_data.tarea.empresa);
        $('#persona_empresa').text(tarea_data.tarea.persona_empresa);
        $('#modal_tareas').modal('show');
    };
</script>

Вид Venta

def VentaDetailView(request):
    ID = request.POST.get('id')
    ventas_todas = Ventas.objects.filter(pk=ID).get()

    venta = {
        "fecha": ventas_todas.fecha,
        "comprobante": ventas_todas.comprobante,
        "cliente": ventas_todas.cliente,
        "vendedor": ventas_todas.vendedor.nombre,
        "lista": ventas_todas.lista,
        "prod_codigo": ventas_todas.prod_codigo,
        "prod_nombre": ventas_todas.prod_nombre,
        "uds": ventas_todas.uds,
        "vu": ventas_todas.vu,
        "subtotal": ventas_todas.subtotal,
        "bonif": ventas_todas.bonif,
    }

    return JsonResponse({'venta': venta})

Вид Тарея

def TareaDetailView(request):
    ID = request.POST.get('id')

    tarea_select = Tareas.objects.filter(pk=ID).get()

    tarea = {
        "creador": tarea_select.creador.username,
        "destinatario": tarea_select.destinatario.username,
        "titulo": tarea_select.titulo,
        "tarea": tarea_select.tarea,
        "resuelto": tarea_select.resuelto,
        "fecha_creacion": tarea_select.fecha_creacion,
        "fecha_limite": tarea_select.fecha_limite,
        "fecha_resuelto": tarea_select.fecha_resuelto,
        "empresa": tarea_select.empresa.Nombre,
        "persona_empresa": tarea_select.persona_empresa.nombre,
    }

    return JsonResponse({'tarea': tarea})

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Понятия не имею, почему часть tareas работает ... но наверняка я бы добавил заголовок 'X-CSRFToken' к обоим вызовам ajax:

$.ajax({
    url:'/catalog/ventas-detail/',
    type:'POST',
    data: $('#form_venta_'+venta_id).serialize(),
    headers: {'X-CSRFToken': getCookie('csrftoken')}
    ...
});

где:

function getCookie(name) {
    var value = '; ' + document.cookie,
        parts = value.split('; ' + name + '=');
    if (parts.length == 2) return parts.pop().split(';').shift();
}
1 голос
/ 19 марта 2019

Также вы можете добавить токен CSRF в заголовок:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken",  getCookie('csrftoken'));
    }
});

Тогда вам не нужно было вручную добавлять свой токен CSRF во все ваши запросы ajax.

...