Django / Python:将模板中的值拉入views.py

时间:2015-04-24 02:04:08

标签: python json django api

我目前在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()函数中的类别变量在使用提交按钮提交表单之前自动分配到下拉栏上的选定选项。搜索栏如下所示:

enter image description here

这样的代码:

<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>

这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

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

在提交表格之前可以这样做。例如,您可以在模板代码中使用 Ajax 调用来访问由json_search函数提供服务的相同 URL ,并在category中传递request.GET URL,然后将其从click中拉出来。

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

在您的POST代码中,您需要区分处理提交(应该是GET)与一般done处理(可能基于是否存在各种参数)在网址)。

根据OP的评论进行编辑:

这肯定不是微不足道的,特别是如果你之前没有使用 Ajax ,但它总体上不应该太糟糕(一旦你掌握了它,这个范例就可以使用了与其他模块(如 Datatables 等)进行各种交互,更不用说你自己的 Django 后端了。

虽然有很多不同的方法可以做到这一点,但我很喜欢将 jQuery whenwhen结合使用(在相同的示例中使用)页)。 done允许您触发多个异步 Ajax 请求, override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let indexpath = tableView.indexPathForSelectedRow() as NSIndexPath! //supposed to get the correct index, but doesn't let cell = tableView.cellForRowAtIndexPath(indexpath) as UITableViewCell! captureCellVals.setObject(cell.textLabel?.text, forKey: "restoname") //code to transfer to final view: let view2 = self.storyboard?.instantiateViewControllerWithIdentifier("finalView") as FinalView self.navigationController?.pushViewController(view2, animated: true) } 充当连接点,等待它们完成后再继续。

答案 1 :(得分:1)

是的,这是可能的,您可以使下拉列表中的所有链接都有一个onclick处理程序,需要保存该类别。然后,您将使用url函数代替表单的submit,该函数将发送您的表单数据+ 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);
}