Изменение доступных вариантов выбора для нескольких Django from на основе текущего выбора
У меня есть форма, которая работает с такими базовыми вариантами:
class ShockForm(forms.Form):
sector = forms.ChoiceField(choices=[
('c1', 'Choice 1'),
('c2', 'Choice 2'),
('c3', 'Choice 3'),
])
amount = forms.FloatField()
форма отображается несколько раз в зависимости от предыдущего выбора пользователя, она отображает n
формы, если n
был введен пользователем на предыдущем экране.
Я хочу сделать формы динамическими, т.е. если пользователь выбирает один вариант в первой форме, то этот вариант не будет доступен в другой форме и так далее, чтобы не было дублирования вариантов.
Я считаю, что JS является решением для этого, так как я не сохраняю каждую форму по одной, а все в один прием (см. виды ниже).
Однако у меня очень мало знаний о JS, и все, что я пробовал, не сработало. Не подскажете?
Вот содержание, относящееся к шаблону:
<form method="post">
{% csrf_token %}
{% for form in shocks_forms %}
<h4>Sector {{ forloop.counter }}</h4>
{{ form.as_p }}
{% endfor %}
<button type="submit">Submit</button>
</form>
А вот полный вид бэкенда, чтобы понять, как отправляются и отображаются формы:
def simulation_shocks_view(request, pk):
simulation = get_object_or_404(Simulation, pk=pk)
number_of_sectors_to_shock = simulation.number_of_sectors_to_shock
if request.method == 'POST':
form_list = [ShockForm(request.POST, prefix=str(i+1)) for i in range(number_of_sectors_to_shock)]
if all(form.is_valid() for form in form_list):
shocks_data = {}
for form in form_list:
sector = form.cleaned_data['sector']
amount = form.cleaned_data['amount']
shocks_data[sector] = amount
simulation.shocks = shocks_data
simulation.save()
return redirect('simulation_details', pk=simulation.id)
else:
pass
else:
form_list = [ShockForm(prefix=str(i+1)) for i in range(number_of_sectors_to_shock)]
context = {
'shocks_forms': form_list,
}
return render(request, 'shock_form.html', context)