django-select2:如果没有选择国家,如何禁用城市选择? (Django 2.2)

时间:2019-04-24 08:47:22

标签: python django jquery-select2 django-select2

我尝试使用像这样的相关字段:

class AddressForm(forms.Form):
country = forms.ModelChoiceField(
    queryset=Country.objects.all(),
    widget=ModelSelect2Widget(
        model=Country,
        search_fields=['name__icontains'],
    )
)

city = forms.ModelChoiceField(
    queryset=City.objects.all(),
    widget=ModelSelect2Widget(
        model=City,
        search_fields=['name__icontains'],
        dependent_fields={'country': 'country'},
    )
)

但是,如果未选择任何国家,则可以使用城市选择。 我想限制用户选择城市而不选择国家。

1 个答案:

答案 0 :(得分:0)

从文档中:https://django-select2.readthedocs.io/en/latest/extra.html#chained-select2

相互依赖的select2

此外,您可能不希望限制用户首先选择哪个字段。相反,您希望根据其在另一个选择中的选择向用户建议任何select2的选项。

以以下方式自定义表单:

class AddressForm(forms.Form):
    country = forms.ModelChoiceField(
        queryset=Country.objects.all(),
        label=u"Country",
        widget=ModelSelect2Widget(
            search_fields=['name__icontains'],
            dependent_fields={'city': 'cities'},
        )
    )

    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        label=u"City",
        widget=ModelSelect2Widget(
            search_fields=['name__icontains'],
            dependent_fields={'country': 'country'},
            max_results=500,
        )
    )

您可以尝试在 init

中为该字段添加初始值
def __init__(self,*arg, **kwargs):
    super(AddressForm,self).__init__(*arg, **kwargs)
    self.initial['city'] = ''

如果要限制用户选择城市,则必须在前端进行操作,因此django无法在提交表单之前控制人们的选择(或者必须制作ajax)每次国家/地区更改时都致电)。

如果您正在考虑使用其他解决方案,这就是我通常这样做的方式(并且它可以满足您的要求):https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html