【问题标题】:Setting a dropdowns values based on a different model selection根据不同的模型选择设置下拉值
【发布时间】:2021-10-29 08:19:26
【问题描述】:

我目前有一个包含 2 个字段的模型: 单位名称和数量

选择第一个字段 e.g. Name = Name1我想显示与该模型关联的单位数量。 e.g. Name1 has 50 units 然后第二个 将显示从 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)

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    如果您不想走 AJAX 路线,我建议将最大单位数添加到第一个 &lt;select&gt; 并将 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】:

      由于 Django 在请求之间进入睡眠状态,因此您不能让它根据选择提供不同的值(即使它看起来非常简单并且使用场景很多)。所以您必须使用一种方法,例如传递如果您想动态显示下拉选项,下拉值作为 AJAX...

      以下链接显示了您正在寻找的简单实现,

      Django chained dropdowns

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 2015-05-19
        • 2016-04-17
        • 2020-02-07
        • 2011-09-15
        • 1970-01-01
        相关资源
        最近更新 更多