есть ли проблемы с отправкой данных из javascript в django таким образом? - PullRequest
0 голосов
/ 09 июля 2020

в шаблоне html

<script> const csrf = '{{ csrf_token }}' </script>
<script src="{% static 'script.js' %}"></script>

в скрипте. js:

const form = new FormData()
form.append('Name','Vitor')
form.append('Age',5)
form.append('csrfmiddlewaretoken', csrf);
const request = new XMLHttpRequest()
request.open('POST','my_form')
request.send(form)
request.onload = function(){
alert('sucess')   
}
request.onerror = function(){
    alert('error')   
}

У меня возникли бы проблемы с ошибками и безопасностью, если бы я отправил данные таким образом

1 Ответ

0 голосов
/ 09 июля 2020

я думаю, вы хотите загрузить javascript локально для конкретной страницы , чтобы сделать это правильно, вам нужно определить {% block %} в вашем шаблоне base.html и через механизм наследования DTL вы можете загрузить javascript правильным образом в правильном порядке без каких-либо конфликтов

в base.html определить, скажем, {% block javascripts_local %}{% endblock %} как

{% load static %}
<!doctype html>
<html class="no-js" lang="{% block lang %}en{% endblock %}">
<head>

[..]

</head>
<body{% block body_attributes %}{% endblock %}>

[..]

  {% block javascripts %}

  <!-- i'm using HTML5 Boiler Plate template -->
  <script src="{% static 'js/vendor/modernizr-3.7.1.min.js' %}"></script>
  <script src="{% static 'js/plugins.js' %}"></script>
  <script src="{% static 'js/main.js' %}"></script>

  <!-- override this block in child template -->
  {% block javascripts_local %}{% endblock %}

  {% endblock %}
</body>
</html>

и затем в вашем дочернем шаблоне переопределите блок

{% extends 'base.html' %}
{% load static %}


[..]

{% block javascripts_local %}
<script>

// refer to 
// https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects

const form = new FormData(document.querySelector("form"));

// FormData takes the form element as its constructor argument, 
// no need to add values individually

// form.append('Name', 'Vitor')
// form.append('Age', 5)
// form.append('csrfmiddlewaretoken', csrftoken);

const request = new XMLHttpRequest()
request.open("POST", "{% url 'my_form' %}", true);
request.send(form)
request.onload = function(){
  alert('sucess')   
}
request.onerror = function(){
  alert('error')   
}
</script>
{% endblock %}

для получения более подробной информации о CSRF с Ajax, обратитесь к этому топу c https://docs.djangoproject.com/en/3.0/ref/csrf/#ajax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...