Установка значений выпадающего списка на основе выбора другой модели
В настоящее время у меня есть модель с 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, если вы хотите динамически показывать выпадающие варианты...
В приведенной ниже ссылке показана простая реализация того, что вы ищете,
Если вы не хотите идти по пути 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