我正在使用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的内容。但是当我点击“发送”按钮发送帖子数据时,我总是收到错误:“选择一个有效的选择。这个选择不是可用的选择之一。”
答案 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)