Значение скрытого поля не определено при отправке после создания с помощью javascript
Я использую django и пытаюсь заставить javascript добавить скрытое поле и затем передать его в представление, чтобы попытаться обработать значение.
Когда я жестко кодирую скрытое поле, используя следующее в моем шаблоне:
<form action="{% url 'add_hamper' hamper_id=hamper.slug %}" method="post" novalidate id="form">
{% csrf_token %}
<input type="hidden" name="option_id" id="option_element" value="85">
<button type="submit" class="btn btn-sm btn-success" id="price_button" data-price="{{ hamper.sale_price }}">{{ hamper.sale_price }}</button>
</form>
Все работает, и я могу видеть значение option_id в моем представлении:
<QueryDict: {'csrfmiddlewaretoken': ['XXXX'], 'option_id': ['85']}>
Однако, когда я начинаю со следующего HTML:
<form action="{% url 'add_hamper' hamper_id=hamper.slug %}" method="post" novalidate id="form">
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-success" id="price_button" data-price="{{ hamper.sale_price }}">{{ hamper.sale_price }}</button>
</form>
А затем используйте следующий javascript для добавления скрытого поля. Я знаю, что в данный момент это уродливо, и я, вероятно, мог бы сделать это более лаконичным способом, но я все еще пытаюсь изучить лучшие способы.
let form = document.getElementById('form');
let option_element = document.getElementById('option_element');
if (option_element){
option_element.remove();
}
let input_elem = document.createElement("input");
input_elem.setAttribute("type", "hidden");
input_elem.setAttribute("name", "option_id");
input_elem.setAttribute("id", "option_element");
input_elem.setAttribute("value", option_id);
form.prepend(input_elem);
В то время как консоль показывает следующее (что выглядит точно так же:
)<form action="/hampers/add_hamper/premium-nibbles" method="post" novalidate="" id="form">
<input type="hidden" name="csrfmiddlewaretoken" value="XXXX">
<input type="hidden" name="option_id" id="option_element" value="85">
<button type="submit" class="btn btn-sm btn-success" id="price_button" data-price="A$75.00">A$89.19</button>
</form>
Представление показывает следующее:
<QueryDict: {'option_id': ['undefined'], 'csrfmiddlewaretoken': ['XXXX']}>
Я изучаю JS по ходу дела, и это меня несколько озадачило
Почему это работает при жестком кодировании, но не работает при инъекции с помощью JS. Я пытался жестко закодировать скрытое поле и просто обновить значение с помощью JS, но значение все равно возвращается как "undefined".
Похоже, что установка data-price
на всех divs
и моих button
приводила к тому, что функция update option
вызывалась дважды. Один раз, когда опция option_id устанавливалась, а второй раз нет.
Еще один опыт обучения. Вздох.