我尝试创建以下内容。我想要一个下拉菜单。根据第一个下拉菜单中选择的选项,将显示第二个下拉菜单中的选项。第二个下拉菜单中的选项是动态的,即选项随第一个菜单中值的变化而变化。
在这里,我没有获得下拉菜单,而是获得以下内容
Choose your Option1: <django.forms.models.ModelChoiceField object at 0x02FE2C10>
Choose your Option2: <django.forms.models.ModelChoiceField object at 0x02FE5A90>
注意:我严格不想使用javascript。
home_form.py
class HomeForm(forms.Form):
def __init__(self, *args, **kwargs):
var_filter_con = kwargs.pop('filter_con', None)
super(HomeForm, self).__init__(*args, **kwargs)
if var_filter_con == '***':
var_empty_label = None
else:
var_empty_label = ' '
self.option2 = forms.ModelChoiceField(queryset = db_option2.objects.filter(option1_id = var_filter_con).order_by("name"),
empty_label = var_empty_label,
widget = forms.Select(attrs={"onChange":'this.form.submit();'})
)
self.option1 = forms.ModelChoiceField(queryset = db_option1.objects.all().order_by("name"),
empty_label=None,
widget=forms.Select(attrs={"onChange":'this.form.submit();'})
)
view.py
def option_view(request):
if request.method == 'POST':
form = HomeForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
if cd.has_key('option1'):
f = HomeForm(filter_con = cd.get('option1'))
return render_to_response('homepage.html', {'home_form':f,}, context_instance=RequestContext(request))
return render_to_response('invalid_data.html', {'form':form,}, context_instance=RequestContext(request))
else:
f = HomeForm(filter_con = '***')
return render_to_response('homepage.html', {'home_form':f,}, context_instance=RequestContext(request))
homepage.html
<!DOCTYPE HTML>
<head>
<title>Nivaaran</title>
</head>
<body>
<form method="post" name = 'choose_opt' action="">
{% csrf_token %}
Choose your Option1:
{{ home_form.option1 }}
<br/>
Choose your Option2:
{{ home_form.option2 }}
</form>
</body>
答案 0 :(得分:2)
我认为你必须像这样设置option1和option2:
self.fields['option2']=forms.ModelChoiceField(...
self.fields['option1']=forms.ModelChoiceField(...
答案 1 :(得分:0)
我不是以这种方式做form
,而是建议另一种方法:
class HomeForm(forms.Form):
option1 = forms.ChoiceField(attrs={"onChange":'this.form.submit();'})
option2 = forms.ChoiceField(attrs={"onChange":'this.form.submit();'})
def __init__(self, *args, **kwargs):
var_filter_con = kwargs.pop('filter_con', None)
super(HomeForm, self).__init__(*args, **kwargs)
if var_filter_con == '***':
var_empty_label = None
else:
var_empty_label = ' '
self.fields['option1'].choices = db_option1.objects.filter(option1_id = var_filter_con).order_by("name")
self.fields['option2'].choices = db_option2.objects.filter(option1_id = var_filter_con).order_by("name")
希望它会有所帮助。