Django 1.6 将下拉选择值传递到另一个模板
我正在尝试在一个名为 doclistings.html 的模板中显示用户从 index.html 页面选择的值。但我发现无法打印出这个值,而且也没有出现任何错误。我觉得这个值可能没有被保存。
这是我在 index 页面中想要保存的下拉菜单的值。
<div class="signup">
<div class="form-group">
<form action="/doclistings/" method="post">
<select class="form-control" id="select" name="spec">
<option><b>Choose a Speciality...</b></option>
<option value ="Dermatologist">Dermatologist</option>
<option value = "Dentist">Dentist</option>
<option value = "ENT">Ear, Nose and Throat (ENT)</option>
<option value = "Opthalmologist">Eye Doctor</option>
<option value = "Psychiatrist">Psychiatrist</option>
<option value = "Orthopedist">Orthopedist</option>
</select>
<span class="input-group-btn">
<button class="btn btn-primary" type="submit" name="submit" id="ss-submit">Find Doctors</button>
</span>
</div>
</div>
我希望用户选择下拉菜单的值后点击提交。然后用户应该被引导到 doclistings 页面,并在页面顶部显示这个值。虽然提交按钮确实能带我到 doclistings 页面,但值并没有被打印出来。
这是我尝试显示值的 doclistings.html 模板。
{{value}}
这是我的 views.py 文件。
def index(request):
d = getVariables(request,dictionary={'page_name': "Home"})
if request.method == "POST":
form = DropdownSelectionForm(request.POST)
if form.is_valid():
selection = form.cleaned_data[{{ form.value }}]
selection.save()
return HttpResponseRedirect('/doclistings', {{ form.value }})
else:
form = DropdownSelectionForm()
return render(request, 'meddy1/index.html', {'form': form})
@csrf_exempt
def doclistings(request):
d = getVariables(request)
doctors = Doctor.objects.all()
paginator = Paginator(doctors, 20) #Show 20 doctors per page
page = page = request.GET.get('page')
try:
doctors = paginator.page(page)
except PageNotAnInteger:
doctors = paginator.page(1)
except EmptyPage:
doctors = paginator.page(paginator.num_pages)
d['doctors'] = doctors
d['paginator'] = paginator
return render_to_response('meddy1/doclistings.html',d)
这是 urls.py 文件。
url(r'^doclistings/$', views.doclistings, name='doclistings'),
这是 forms.py 文件。
class DropdownSelectionForm(forms.Form):
selection = forms.CharField()
1 个回答
1
你这里有不少问题。
最主要的问题是,你在 <select>
标签里没有加 name
属性,这样浏览器根本不会发送数据,导致 request.POST
是空的。
不过,你有一个表单,所以你应该用表单来显示数据,而不是手动在 HTML 里列出选择框和选项。你只需要用 {{ form.value }}
来显示就可以了。
但是你又遇到问题了:你在视图里创建了 form
变量,但从来没有把这个变量传递给模板上下文。你缺少了传给 render
的第三个参数,也就是模板变量的字典:
return render(request, 'meddy1/index.html', {'form': form})
在 doclistings
里你也有同样的问题:你正在愉快地构建一个字典 d
,里面包含了所有你想在模板中使用的变量,但你从来没有把它们传递给那个模板。正确的调用方式应该是:
return render(request, 'meddy1/doclistings.html', d)