在Django中,如何将选定的下拉值从模板传递到视图?

时间:2013-11-08 16:13:35

标签: django

我搜索了这么久的解决方案,但仍然找不到任何解决方案。我的模板中有一个很大的表单,实际上是由一堆模型表单组成的。该大表单中的一个字段不是表单的一部分,而是一个单独的动态下拉菜单,填充在views.py中名为“INSTIT”的表中,如下所示:Institutions.objects.all()

以下是来自views.py的部分:

def submission_form(request):

    institutions = Institution.objects.all()

    if request.method == 'POST':
        abstractform = AbstractForm(request.POST)
        authorform = AuthorForm(request.POST)

        # Here I want code: if selected institution is this, then do that

        if abstractform.is_valid() and authorform.is_valid()
            new_abstract = abstractform.save()
            new_author = authorform.save()


     else:  
         return render(request, 'records/submission_form.html', {'abstractform': abstractform, 'authorform': authorform, 'institutions':institutions })

这是我的模板中的下拉列表:

 <select id="ddlInstititions">
    <option value="%">---------</option>
    {% for entry in institutions %} 
     <option value="{{ entry.id }}">{{ entry.name }}</option>
    {% endfor %}
</select>

我的问题是:是否可以将选定的entry.name传递给视图,以便我可以在那里使用它?如果没有,你建议做什么呢?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:9)

为了在POST中发送任何表单元素,您需要具有name属性。所以它应该是<select id="ddlInstititions" name="institutions">

POST中传递给视图的内容是每个value元素的option属性。目前,您已将其设置为entry.id,因此它将是POST中的ID。您可以使用它来查找Institution对象并获取名称,也可以更改表单,以便将entry.name直接放在value属性中。

答案 1 :(得分:5)

你可以使用jQuery的$ .ajax()。

在您的Javascript中,您可以通过

将事件处理程序绑定到#ddlInstititions
$("#ddlInstitions").on("change", function(){
  var selectedValue = $(this).text();

  $.ajax({
    url : "insititionsSelectHandler/",
    type : "GET",
    data : {"name" : selectedValue},
    dataType : "json",
    success : function(){

    }
  });
});

这将做什么是当您在下拉列表中创建一个select事件时,它将触发此事件处理程序。你必须在你的`urls.py'中定义这个URL,如

(r'^/institionsSelectHandler/$', views.insititionsSelectHandler),

您可以在视图方法中获取值,如

def insititionsSelectHandler(request):
   key = request.GET["name"]
   ...
   ...
   ...
   #and return your results as a HttpResponse object that contains a dict
   return HttpResponse(simplejson.dumps({"success" : "true", "message" : ... }, mimetype = "application/json")