Django 1.6 将下拉选择值传递到另一个模板

1 投票
1 回答
1462 浏览
提问于 2025-04-18 09:31

我正在尝试在一个名为 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)

撰写回答