Изменение доступных вариантов выбора для нескольких 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)
Вернуться на верх