【问题标题】:Django Form: "Select a valid choice. That choice is not one of the available choices."Django 表单:“选择一个有效的选项。该选项不是可用选项之一。”
【发布时间】:2016-09-30 19:44:56
【问题描述】:

我正在使用 Python2 和 Django 1.9。

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

例如,如果下拉列表 #1 选择了“类别”选项,则下拉列表 #2 应显示选项“类别 A、类别 B 和类别 C”。同样,如果 dropdown#1 选择了“Department”选项,则 Dropdown#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())

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

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

【问题讨论】:

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


    【解决方案1】:

    一种选择是在表单的__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'])
    

    【讨论】:

    • 谢谢@raphv,但我不确定“MyModel”应该代表什么?我应该放什么来代替那个?
    • @Xar,应该是像Department.objects.filter(somefield=self.data['selected_value'])这样的stm
    【解决方案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) 
    

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2018-06-11
      • 2021-04-12
      • 2012-01-22
      • 2018-08-13
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多