在同一Pyramid页面上使用多个JQueryUI自动完成实例

0 投票
1 回答
626 浏览
提问于 2025-04-17 03:33

我有一个用JQueryUI做的自动完成输入框,它和我的Pyramid后端配合得很好。这个自动完成会把它的 request.params['term'] 发送到当前页面的同一个网址,而Pyramid则用 request_param='term' 作为路由条件,把这个“term”值传给我的数据库查询。

不过现在我遇到的问题是,我需要在同一页面上添加更多的自动完成输入框。但是,我不能再使用相同的路由条件 term,因为这两个输入框都会发送 term,所以Pyramid不知道该把这个请求发送到哪里。

我知道在Pyramid中可以创建自定义的路由条件,但就我所见,这两个自动完成输入框没有什么独特的地方可以用来创建自定义条件。

为了让你更明白,下面是路由和视图的定义。这个定义其实是非法的,因为Pyramid正确地拒绝了相同的条件,但这可以帮助说明我的困境:

config.add_route('search_programs','/search/programs')
config.add_view(
        'haystack.search.search_programs',
        route_name='search_programs',
        renderer='templates/search_programs.jinja2')
config.add_view(
        'haystack.search.programtype_autocomplete',
        route_name='search_programs',
        request_param='term', renderer='json')
config.add_view(
        'haystack.search.majorgenre_autocomplete',
        route_name='search_programs',
        request_param='term', renderer='json')

如果自动完成输入框能有一个选项,让我可以指定一个任意的键来发送,而不是每次都用' term',那就太好了。任何帮助都会很棒。

1 个回答

3

你需要为每个小部件明确设置autocomplete,并指定一个特定的网址和/或在提交时包含一些自定义的数据。

这是来自JQueryUI文档中远程JSONP数据源示例的一部分:

$( "#a-particular-auto-complete-widget" ).autocomplete({
    source: function( request, response ) {
        $.ajax({ 
                 /* specifiy your specific url here - could be a different 
                  * route for each different source....
                  */
                 url: "http://someurl.com/search/programs/majorgenre",
                 dataType: "jsonp",
                 data: { featureClass: "P",
                         style: "full",
                         maxRows: 12,
                         /* ...or add a custom piece of data to 
                          * indicate how it should be handled by 
                          * your Pyramid view(s).
                          */
                         customParam: "majorgenre",
                         name_startsWith: request.term
                       }
 /* see docs for rest of code... */
 .... 

然后你可以根据自己的需要在Pyramid中处理它。我可能只会将一个视图映射到这个路由上(而不去管ajax中的customParam):

config.add_route('search_programs','/search/programs/{autocomplete}')

接着在视图中:

def autocomplete_handler_view(request):
    autocomplete_type = request.matchdict.get('autocomplete', None)
    if autocomplete == 'majorgenre':
        return handle_majorgenre(request.params['term'])

    elif autocomplete == 'programtype':
        return handle_programtype(request.params['term'])

撰写回答