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

Posted

技术标签:

【中文标题】django-select2:如果没有选择国家,如何禁用城市选择? (django 2.2)【英文标题】:django-select2: how to disable City selection if no Country is selected? (django 2.2) 【发布时间】:2019-09-13 12:11:32 【问题描述】:

我尝试使用这样的依赖字段:

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】:

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

相互依赖的选择2

此外,您可能不想限制用户应该首先选择哪个字段。相反,您想根据用户在另一个选项中的选择向用户建议任何 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

【讨论】:

但我想限制 对不起,这不是我要找的

以上是关于django-select2:如果没有选择国家,如何禁用城市选择? (django 2.2)的主要内容,如果未能解决你的问题,请参考以下文章

将 django-select2 与 django-filters 连接

使用 django-select2 管理标签

如何在 Django 中设置 Django-Select2 小部件的初始值

django-select2 基于类或基于函数的视图

如何在 django 管理站点中使用 django-select2 小部件?

使用 django-select2 获取带有图片的下拉列表