Django 表单 ChoiceField 依赖于另一个 ChoiceField

Posted

技术标签:

【中文标题】Django 表单 ChoiceField 依赖于另一个 ChoiceField【英文标题】:Django form ChoiceField depend on another ChoiceField 【发布时间】:2014-07-11 14:33:01 【问题描述】:

我有以下表格:

class MyForm(forms.Form):
    country = forms.ChoiceField(
        widget = forms.Select()
    )

    region = forms.CharField(
        widget = forms.Select()
    )

    def update_region(self):
        self['region'].field.widget.choices = get_choices_for_region(
            self['region'].field.initial)

地区选择取决于国家/地区选择。我有一个 ajax 例程来更新所选国家/地区的区域。我对该区域使用了 CharField,因此它可以正确验证。

实际上,我在视图中预先填充了表单:

myform['country'].field.initial = 'Switzerland'
myform.update_region()
return ...

问题:有没有办法强制地区选择随着国家的更新而自动更新?

【问题讨论】:

看看这个包中的链式选择Django Smart Selects 我必须做一个类似的项目,我有 3 个选择器Continent->Country->Region,最后我通过 JQuery 和 AJAX 管理它们,每次大陆变化时,国家选择器都会加载相关的国家和地区选择器为空 @Razcou,这个项目的问题在于它似乎都来自模型。在我的例子中,它是一个没有相关模型的表单。 【参考方案1】:

我最近碰巧遇到了类似的问题(并且在这方面浪费了比预期更多的时间)。为了加快这个过程,我首先在页面加载时在视图中创建了 Country-Region Lists。然后,在 Jquery Magic 的帮助下,您可以根据所选的国家/地区字段动态设置区域字段。

这也是您在 link 中寻找的内容的简单实现。

此外,每次更改国家/地区的字段(以获取所选国家/地区的区域字典列表,我们称其为 region_for_country)以更新区域选项时,还有一个更好的替代方法可以进行 AJAX 调用。在 Jquery 中找到以下 sn-p 来完成部分工作。

var html = $.map(regions_for_country, function(item)
        return '<option value="' + item['key'] + '">' + item['value'] + '</option>'
    ).join('');

这将为您可以使用.html() 命令轻松替换的选项生成 html 代码。我更喜欢最后一种方法,因为在前面的方法中我们浪费时间生成国家/地区的键值对,这可能对大数据集有害。

【讨论】:

我发现一个预编译的 Lodash 模板可用于在这种情况下从 JSON 数据中换出动态 HTML——在没有像 Backbone 或 Angular 这样的正式 JS MVC 框架的情况下:lodash.com/docs/4.16.4#template

以上是关于Django 表单 ChoiceField 依赖于另一个 ChoiceField的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单。使前端 <select> 需要 ChoiceField

从 Django 表单 ChoiceField 中检索选定的选项

基于选择的 Django 模板/ChoiceField 显示字段

Django Form 将 ChoiceField 选项设置为 Form 被调用

Django内置表单字段

将自定义html添加到django中的choicefield标签