我有一个工作的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')
如果自动填充小部件有一个选项可以指定任意键进行发布,而不是每次都只使用“术语”,那将是多么棒的。任何帮助都会很棒。
答案 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'])