根据不同的模型选择设置下拉值

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 显示了您正在寻找的内容的简单实现,

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