2012-04-28 46 views
3

我想知道:
是否有可能在路由配置模式中提供默認值?
例如:我有一個視圖,顯示綁定到數據集的文件(可能很大)的列表。 我想分解頁面中的視圖,每個頁面顯示100個文件。當url模式中的頁面部分被省略時,我想要顯示第一頁。
所以我想有這樣的:金字塔:路由模式中的默認值

config.add_route('show_files', '/show_files/{datasetid}/{page=1}) 

是這樣的,或者可行與合理的努力替代? 我在金字塔文檔的路由語法描述中沒有找到任何東西。

非常感謝!

回答

12

您可能滿足this answer,但另一種選擇是使用多條路由發送到相同的視圖。

config.add_route('show_files', '/show_files/{datasetid}') 
config.add_route('show_files:page', '/show_files/{datasetid}/{page}') 

@view_config(route_name='show_files') 
@view_config(route_name='show_files:page') 
def show_files_view(request): 
    page = request.matchdict.get('page', '1') 
1

一個(哈克)的方式來設置它是使用custom predicate。更改匹配是明確允許的。

def matchdict_default(**kw): 
    def f(info, request): 
     for k, v in kw.iteritems(): 
      info['match'].setdefault(k, v) 
     return True 
    return f 

config.add_route(
    'show_files', 
    '/show_files/{datasetid}/{page}') 
config.add_route(
    'show_files', 
    '/show_files/{datasetid}', 
    custom_predicates=(matchdict_default(page=1),)) 
0

我無法獲得Thomas Jungs示例工作。我能夠通過迭代密鑰而不使用iteritems()來獲得Thomas Jung的示例。

def matchdict_default(**kw): 
def f(info, request): 
    for k in kw: 
     info['match'].setdefault(k, kw[k]) 
    return True 
return f 

config.add_route(
'show_files', 
'/show_files/{datasetid}/{page}') 
config.add_route(
'show_files', 
'/show_files/{datasetid}', 
custom_predicates=(matchdict_default(page=1),))` 

now both of the following urls resolve to the page value, and, urls 
can be created without needing to include a query 
parameter 

/show_files/an_id/ 
/show_files/an_id/?page=1