Как включить CSRF-токен в сообщение формы с жестким кодом
У меня есть следующая таблица данных AJAX:
$('#ittFileUploadTable').DataTable( {
responsive: true,
autowidth: false,
destroy: true,
deferRender: true,
ajax: {
url: '/project_page_ajax/',
type: 'GET',
data: {},
dataSrc: ""
},
columns: [
{"data": "fields.filename"},
{"data": "fields.uploaded"},
{"data": "fields.updated"},
{"data": "fields.user"},
{"data": "pk"},
],
columnDefs: [
{ className: 'text-center', targets: [1] },
{
targets: [0],
class: 'text-center',
orderable: false,
render: function (data, type, row) {
var buttons = '<a href="/media/'+data+'" target="_blank">'+data+'</a>';
return buttons;
}
},
{
targets: [-1],
class: 'text-center',
orderable: false,
render: function (data, type, row) {
var buttons = '<form method="post" action="delete_file/'+data+'/"><button type="submit" class="btn btn-danger"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="white" class="bi bi-trash-fill" viewBox="0 0 16 16"><path d="M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1H2.5zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5zM8 5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5zm3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0z"/></svg></button></form>';
return buttons;
}
},
],
order: [
[0, 'asc']
],
"pagingType": "numbers",
dom: 'rt'
});
Функция в render
в основном генерирует кнопку внутри form
.
Этот form
отправляет POST
запрос к представлению /delete_file/<int:pk>/
в моем бэкенде, которое удаляет выбранный файл.
Проблема в том, что эта форма (var buttons
) жестко закодирована в виде строки, и я не знаю, каким образом я мог бы поместить {% csrf_token %}
в строку.
Я попробовал getCookie
функцию из документации , но это в основном дает мне строку, полную случайных символов, как можно ввести токен в "жестко закодированном" виде?
Что я пробовал (основываясь на предыдущих вопросах/ответах SO):
Установка заголовка headers: {'X-CSRFToken': '{{ csrf_token }}'},
в вызове AJAX и внедрение результата вызова функции getCookie('csrftoken')
в жестко закодированную форму безуспешно.
var csrftoken = getCookie('csrftoken');
//Project Header > ITT > Multiple File upload
$('#ittFileUploadTable').DataTable( {
responsive: true,
autowidth: false,
destroy: true,
deferRender: true,
ajax: {
url: '/project_page_ajax/',
type: 'GET',
headers: {'X-CSRFToken': '{{ csrf_token }}'},
data: {},
dataSrc: ""
},
columns: [
{"data": "fields.filename"},
{"data": "fields.uploaded"},
{"data": "fields.updated"},
{"data": "fields.user"},
{"data": "pk"},
],
columnDefs: [
{ className: 'text-center', targets: [1] },
{
targets: [0],
class: 'text-center',
orderable: false,
render: function (data, type, row) {
var buttons = '<a href="/media/'+data+'" target="_blank">'+data+'</a>';
return buttons;
}
},
{
targets: [-1],
class: 'text-center',
orderable: false,
render: function (data, type, row) {
//var buttons = '<a href="#" class="btn btn-danger btn-xs"></a>';
var buttons = '<form method="post" action="delete_file/'+data+'/"><button type="submit" class="btn btn-danger"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="white" class="bi bi-trash-fill" viewBox="0 0 16 16"><path d="M2.5 1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1H3v9a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4h.5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1H2.5zm3 4a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 .5-.5zM8 5a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-1 0v-7A.5.5 0 0 1 8 5zm3 .5v7a.5.5 0 0 1-1 0v-7a.5.5 0 0 1 1 0z"/></svg></button></form>';
return buttons;
}
},
],
order: [
[0, 'asc']
],
"pagingType": "numbers",
dom: 'rt'
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
Ошибка, которую я получаю:
Чтобы получить csrf-токен из куки, а не из скрытого поля формы, Django необходимо сначала установить куки csrf-токен. Например:
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
class MyView(View):
template_name = 'my_template.html'
@method_decorator(ensure_csrf_cookie)
def get(self, request, *args, **kwargs):
return render(request, self.template_name)
def post(self, request, *args, **kwargs):
# and so on..
pass
Теперь вы можете подтвердить с помощью инструментов вашего браузера, что есть две cookie, одна сессионная cookie и одна csrf cookie.
Таким образом, нет необходимости включать {% csrf_token %}
в шаблон. Хотя это и другой способ сделать это.