避免在ModelChoiceField中加载所有选项以通过ajax加载值

时间:2014-12-17 23:12:01

标签: django django-forms

我正在尝试使用ModelChoice字段创建表单。该字段由ajax请求过滤。

self.fields['center'].queryset = TrainingCenter.objects.all()

这很好用。但我正在使用基于另一个字段的ajax加载值。

如果我使用空的查询集来加载没有选择的表单,我会得到"无效的选择"提交时出错。

  • 如何避免加载所有选项而不会在提交时出错

1 个答案:

答案 0 :(得分:0)

您可以编写一个EmptySelect窗口小部件类,忽略传递给它的选项,如下所示:

class EmptySelect(forms.Select):

    def _get_choices(self):
        return ()

    def _set_choices(self, value):
        pass

    choices = property(_get_choices, _set_choices)

然后,使用要验证的查询集定义字段,并将EmptySelect配置为窗口小部件。

 center = forms.ModelChoiceField(
    queryset=TrainingCenter.objects.all(),
    widget=EmptySelect
)

您也可以继承其他选择小部件,甚至可以将EmptySelect转换为可以与任何选择小部件一起使用的mixin。