Установка значений выпадающего списка на основе выбора другой модели

В настоящее время у меня есть модель с 2 полями: Name & Number of Units

При выборе первого поля e.g. Name = Name1 я хотел бы отобразить количество единиц, сохраненных в связи с этой моделью. e.g. Name1 has 50 units тогда второе < select > покажет число в виде списка от 1 до 50, потому что Name1 имеет 50 единиц.

Когда я делаю это с моим текущим кодом, он перечисляет максимальное количество единиц для каждой модели вместо этого

Пожалуйста, посмотрите приведенный ниже код:

template.html:

<form>
    <select  name="Complex">
        {% for x in model %}
            <option value="{{ x }}">{{ x.ComplexName }}</option>
        {%  endfor %}
    </select>> Complex


    <select>
        {% for x in model %}
            <option value="{{ x.NumberOfUnits }}">{{ x.NumberOfUnits }}</option>
        {% endfor %}
    </select>

</form>

Views.py:

def customerDetails(request):
    model = ComplexListClass.objects.all().order_by('ComplexName')

    content = {'model': model}
    return render(request, 'main/customerDetails.html', content)

Models.py:

class ComplexListClass(models.Model):
    ComplexName = models.CharField(choices=complex_list , max_length =  50 ,default='1' , unique=True)
    NumberOfUnits = models.IntegerField(max_length=2 , blank=False , default=1 )

    def __str__(self):
        return (self.ComplexName)

Поскольку Django засыпает между запросами, вы не можете заставить его обслуживать различные значения на основе выбора (хотя это выглядит очень просто и часто используется в сценарии)... Поэтому вам придется использовать обходные пути, например, передавать значения выпадающего списка как AJAX, если вы хотите динамически показывать выпадающие варианты...

В приведенной ниже ссылке показана простая реализация того, что вы ищете,

Django chained dropdowns

Если вы не хотите идти по пути AJAX, я бы предложил добавить максимальное количество единиц в первый <select> и сделать NumberOfUnits целочисленным полем ввода (с валидатором минимального значения 1?). Валидация формы может дополнительно проверить, что число не превышает доступное количество, о котором пользователю уже было сказано. Вызвать ошибку валидации о превышении максимума.

<form>
<select  name="Complex">
    {% for x in model %}
        <option value="{{ x }}">
            {{ x.ComplexName }} ({{ x.NumberOfUnits }} available </option>
    {%  endfor %}
</select>> Complex

{{form.number_of_units}}

и в вашей форме переопределите метод clean для проверки

    def clean(self):
        #get clean values from the form
        cleaned_data=super().clean()

        complex_name = cleaned_data['ComplexName')

        # t.b.s. get the maximum_units for this name here 

        if cleaned_data['NumberOfUnits'] > maximum_units:
            raise forms.ValidationError(
                f"Only {maximum_units} available for {complex_name}" )
        return cleaned_data
Вернуться на верх