Django/Python:从模板中提取值到 views.py

Django/Python: Pulling value from template into views.py

我的 views.py 文件中目前有一个搜索功能,如下所示:

def json_search(request):
    query = request.GET.get('query')
    api_key = locu_api
    url = 'https://api.locu.com/v1_0/venue/search/?api_key=' + api_key
    locality = query.replace(' ', '%20')
    category = 
    final_url = url + "&locality=" + locality + "&category=" + category
    json_obj = urllib2.urlopen(final_url)
    decoded_data = json.load(json_obj)
    return render(request, 'loc_search.html',
                       {'objects': decoded_data['objects']})

我设置的是一个下拉搜索栏,我希望 json_search() 函数中的类别变量自动分配给表单前下拉栏上的所选选项使用提交按钮提交。搜索栏如下所示:

代码如下:

<form action="{% url 'search' %}">
<div class="input-group">
        <input name="query" input id="address" type="textbox" placeholder="City or Zipcode" class="form-control datebox">
        <div class="input-group-btn">
            <button class="btn btn-default" type="submit" id="addressSearch">Search</button>
            <button name = "category_query" tabindex="-3" data-toggle="dropdown" class="btn btn-default dropdown-toggle" type="button">
                <span class="caret"></span>
                <span class="sr-only">Toggle Dropdown</span>
            </button>
            <ul class="dropdown-menu" >
                <li><a href="restaurants">Resturant</a></li>
                <li><a href="active">Activities</a></li>
                <li><a href="bars">Bar / Club</a></li>
                <li class="divider"></li>
                <li><a href="other">other</a></li>
            </ul>
        </div>
    </div>
</form>

这可能吗?

您必须以某种方式将值返回到后端 查看 代码才能实现。

可以在提交表格之前这样做。例如,您可以在模板代码中使用 Ajax 调用来命中由 json_search函数,在URL中传入category,然后从request.GET.

中拉出

如果您希望在下拉选择时分配它,您需要通过 jQuery 附加一个 click 事件处理程序 到该下拉列表,然后在该处理程序的函数中,获取所选值,然后将其添加到 Ajax 回调到您的 json_search 函数。

在您的 json_search 代码中,您需要区分处理提交(应该是 POST)与一般 GET 处理(可能基于各种参数是否出现在 URL).

根据 OP 的评论进行编辑:

这当然不是微不足道的,特别是如果你以前没有使用过 Ajax,但总体来说应该不会太糟糕(一旦你得到坚持下去,这个范例可以用于与其他模块的各种交互,比如 Datatables 和许多其他模块,更不用说你自己的 Django 后端).

虽然有很多不同的方法可以做到这一点,但我更喜欢将 jQuerywhen 与 [=19 结合使用=](在同一页的示例中使用)。 when 允许您触发多个异步 Ajax 请求,而 done 充当连接点,您可以在其中等待它们完成后再继续.

是的,这是可能的,您可以使下拉列表中的所有链接都有一个需要保存类别的 onclick 处理程序。然后,您将使用 submit 函数代替表单的 url 函数,该函数将发送您的表单数据 + category.

这很容易用 angular + ui.bootstrap


和jQuery

http://plnkr.co/edit/iBY2n9dq8Tn95IUGwNAB?p=preview

您需要将链接转换为不具有有效的 href,而是调用一个函数,例如:

<a href="#" onclick="setCategory('restaurant')">Restaurant</a>

并为类别添加一个隐藏字段

<input name="category" input="" id="category" type="hidden" placeholder="Category" class="form-control" />

还有一些简单的javascript

function setCategory(category) {
  alert('category (hidden) = ' + category);
  $('#category').val(category);
}