根据不同的模型选择设置下拉值
Setting a dropdowns values based on a different model selection
我目前有一个包含 2 个字段的模型:
名称和单位数量
当第一个字段 selected 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 传递...
下面的 link 显示了您正在寻找的内容的简单实现,
如果您不想走 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
我目前有一个包含 2 个字段的模型: 名称和单位数量
当第一个字段 selected 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 传递...
下面的 link 显示了您正在寻找的内容的简单实现,
如果您不想走 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