使ChoiceField()取任何值

时间:2011-07-01 09:33:01

标签: python django forms

我正在使用表单框架,我正在使用javascript魔法将一些值动态注入选择框(此选择框的值依赖于另一个值)。

基本上你有团队和玩家。您需要定义一个玩家,但玩家数据来自一个团队。

在我的表格课程中我有

team = forms.ModelChoiceField(queryset=Team.objects.all()
player = forms.ChoiceField()

在用户从选择框中选择一个团队的前端,(空)播放器框可以使用新数据正确更新。但是当我点击提交时,播放器选择框会抛出错误Select a valid choice. 2 is not one of the available choices. 2是一个有效的选择。

这有什么办法吗?我可以使ChoiceField()取任何值吗?

3 个答案:

答案 0 :(得分:3)

按复杂性DESC命令:

  1. 预先填写所有可能的选择。例如,如果您选择了玩家的ID,则会为choices = Player.objects.values_list('id', flat=True)
  2. 将其定义为CharField,但在模板中手动将其呈现为选择框。
  3. 不要在表单中定义它,而是将它的值传递给表单的构造函数(您需要覆盖它以处理此值。)

答案 1 :(得分:2)

您可以将字段定义为带表单的CharField。选择作为窗口小部件。这样,该字段将呈现为空的select元素,并将接受任何值。

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

如果您使用Select2并通过ajax加载值,这将非常有用。

答案 2 :(得分:0)

您可以创建自己的ChoiceField,例如从ChoiceField扩展的DynamicChoiceField。然后,您可以覆盖“clean”方法,不进行任何验证,就像使用常规ChoiceField一样。

class DynamicChoiceField(forms.ChoiceField):     
    def clean(self, value):
        // Do whatever validation needs to happen

在表单中,您可以使用DynamicChoiceField而不是ChoiceField