Django Choice Dropdown не работает на клонированной форме в Formset
Я клонирую свою пустую форму в django, следуя указаниям, которые я нашел в других местах в stack overflow. JS добавляет новую форму, как и предполагалось, однако выпадающие элементы из виджета выбора больше не работают, и я не могу понять, почему.
Я уже проверил, что все параметры присутствуют, используя функцию осмотра браузера. Похоже, что javascript не работает с объектом.
Это из шаблона:
<form method="post"> {% csrf_token %}
<div id="form_set">
{{ FightForms.management_form|materializecss }}
{% for form in FightForms %}
<div class="card white darken-1 col m12">
<table class='no_error'>
{{ form.non_field_errors }}
<row>
<div class="col m3">
<div class="fieldWrapper">
{{ form.guild_member_id|materializecss }}
</div>
</div>
</row>
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
</table>
</div>
{% endfor %}
</div>
<div class="col m12">
<div>
<input class="btn light-blue lighten-1" type="button" value="Add More" id="add_more">
</div>
<br>
<button class="btn light-blue lighten-1" type="submit">Submit Guild Members</button>
</div>
<div id="empty_form" style="display:none">
<div class="card white darken-1 col m12">
<table class='no_error'>
{{ FightForms.empty_form.non_field_errors }}
<row>
<div class="col m3">
<div class="fieldWrapper">
{{ FightForms.empty_form.guild_member_id|materializecss }}
</div>
</div>
</row>
{% for hidden in form.hidden_fields %}
{{ hidden|materializecss }}
{% endfor %}
</table>
</div>
</div>
</form>
<script>
$('#add_more').click(function() {
var form_idx = $('#id_form-TOTAL_FORMS').val();
$('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
$('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
</script>
Вот мои импорты заголовков, если это проблема с версионированием или чем-то еще...
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0"/>
<title>League Chronicler</title>
<link rel="shortcut icon" type="image/png" href="{% static 'img/CScroll.png' %}"/>
<!-- CSS -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="{% static 'css/chronicler.css' %}" type="text/css" media="screen,projection"/>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
{% block css %}
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
{% endblock css %}
<!-- javascript -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>
Выпуск:
В вашем коде вы инициализируете выпадающий список выбора, который находится внутри вашей "#empty_form" в начале, поэтому он генерирует все теги, т.е.: <ul><li>..
и т.д., которые не нужны, поскольку этот div скрыт.
Восстановление проблемы с помощью фиктивного html:
$('#add_more').click(function() {
var form_idx = $('#id_form-TOTAL_FORMS').val();
$('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
$('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
$(document).ready(function() {
$('select').formSelect();
});
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<!-- javascript -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="col m12">
<div>
<input class="btn light-blue lighten-1" type="button" value="Add More" id="add_more">
</div>
<br>
<button class="btn light-blue lighten-1" type="submit">Submit Guild Members</button>
</div>
<input type="text" id="id_form-TOTAL_FORMS" value="1">
<div id="form_set">
</div>
<div id="empty_form">
<div class="card white darken-1 col m12">
<select id="__prefix__">
<option>----</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
</div>
</div>
Решение:
Вместо того чтобы инициализировать выпадающий список при запуске, сохраните исходный список как есть и после клонирования html инициализируйте последний добавленный список с помощью formSelect()
.
Рабочий код с фиктивным html:
$('#add_more').click(function() {
var form_idx = $('#id_form-TOTAL_FORMS').val();
$('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx)); //apppend it
$('#form_set .choice_dropdown:last').formSelect(); //then initalize the last appended dropdown
$('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<!-- javascript -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="col m12">
<div>
<input class="btn light-blue lighten-1" type="button" value="Add More" id="add_more">
</div>
<br>
<button class="btn light-blue lighten-1" type="submit">Submit Guild Members</button>
</div>
<input type="text" id="id_form-TOTAL_FORMS" value="0">
<div id="form_set">
</div>
<div id="empty_form" style="display:none;">
<div class="card white darken-1 col m12">
Guild Member Name:
<!--added class to this select you can add any class name-->
<select class="choice_dropdown" id="__prefix__">
<option>----</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
</div>
</div>