同一金字塔页面上的多个JQueryUI自动完成实例

时间:2011-10-03 00:57:36

标签: python jquery-autocomplete pyramid

我有一个工作的JQueryUI自动完成输入小部件与我的Pyramid后端很好地协同工作。自动填充将其request.params['term']发布到与其所在页面相同的URL,Pyramid使用request_param='term'作为路由谓词将术语值发送到我的数据库查询视图 - 可调用。

我现在遇到的问题是,我需要在同一页面添加更多自动完成小部件。但是,我不能使用相同的路由谓词term,因为这两个小部件都发布term,因此Pyramid不知道在哪里发送帖子。

我知道你可以在Pyramid中制作自定义谓词,但据我所知,2个自动完成小部件没有什么独特之处可以用来制作自定义谓词。

为了给出一些上下文,下面是路径/视图定义。这个定义实际上是非法的,因为金字塔正确地拒绝了相同的谓词,但这有助于证明我的困境:

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

如果自动填充小部件有一个选项可以指定任意键进行发布,而不是每次都只使用“术语”,那将是多么棒的。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

您需要明确为每个小部件设置autocomplete,并在帖子中指明特定的网址和/或自定义数据。

这是来自JQueryUI文档的Remote JSONP datasource示例的剪辑:

$( "#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... */
 .... 

然后你可以随意在金字塔中处理它。我可能只是将一个视图映射到这条路线(而不是打扰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'])