Django表格:“选择一个有效的选择。这个选择不是可用的选择之一。”

时间:2016-06-01 12:28:57

标签: python django python-2.7 django-forms django-1.9

我正在使用Python2和Django 1.9。

基本上我有一个包含两个下拉列表的表单。第二个下拉列表取决于第一个下拉列表的值。

例如,如果下拉列表#1选择了“类别”选项,则下拉列表#2应显示选项“CategoryA,CategoryB和CategoryC”。同样,如果下拉列表#1选择了“部门”选项,则下拉列表#2应显示“Department1,Department2,Department3”。

请注意,“Departments”和“Categories”都是具有相应数据库表的类。

所以这是我的问题。如何定义该表单?更具体地说,我如何指示第二个表单有时会显示类Category中的对象,有时还会显示类Department的对象?

这是我到目前为止所做的:

class MyClassForm(forms.Form):]
    name = forms.CharField(max_length=255)
    dropdown1 = forms.ModelChoiceField(
        queryset=TypeOfCriteria.objects.all().order_by('name'))
    dropdown2 = forms.ModelChoiceField(
        queryset=Department.objects.none())

注意我如何定义dropdodown2

    dropdown2 = forms.ModelChoiceField(
        queryset=Department.objects.none())

如何为queryset定义参数dropdown2的值?由于我必须指定要查询的类以获取其所有实例的列表,我该怎么做?

现在,我正在使用JQuery加载dropdown2的内容。但是当我点击“发送”按钮发送帖子数据时,我总是收到错误:“选择一个有效的选择。这个选择不是可用的选择之一。”

2 个答案:

答案 0 :(得分:4)

一种选择是在表单的__init__方法中动态更新查询集。按原样保留表单的其余部分,然后添加以下代码:

def __init__(self, *args, **kwargs):
    super(MyClassForm, self).__init__(*args, **kwargs)
    if 'dropdown1' in self.data:
        self.fields['dropdown2'].queryset = Department.objects.filter(typeofcriteria=self.data['dropdown1'])

答案 1 :(得分:2)

在init方法

    def __init__(self,  *arts,  **kwargs):
      super(MyClassForm, self).__init__(*args, **kwargs) 
      self.fields['dropdown2'].queryset = Department.objects.none()
      if self.is_bound:
         self.fields['dropdown2'].queryset = Department.objects.filter(# any value in self.data)