4

我想知道:
是否有可能在路由配置模式中提供默认值?
例如:我有一个视图显示绑定到数据集的文件(可能很大)列表。我想将视图拆分为页面,每个页面显示 100 个文件。当省略 url 模式中的页面部分时,我希望显示第一页。
所以我想要类似的东西:

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

是这样,还是通过合理的努力可行的替代方案?我在金字塔文档的路由语法描述中没有找到任何内容。

非常感谢!

4

4 回答 4

14

您可能对这个答案感到满意,但另一种选择是使用多条路由分派到同一个视图。

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')
于 2012-04-28T21:52:07.257 回答
2

不,但您可以使用余数匹配使页面成为可选页面,然后决定在您的实际逻辑中显示哪个页面。

http://readthedocs.org/docs/pyramid/en/master/narr/urldispatch.html

另一种选择是让您的页面简单地成为 GET 变量而不是 URL 的一部分。

于 2012-04-28T18:22:31.947 回答
1

设置它的一种(hacky)方法是使用自定义谓词。明确允许更改 matchdict。

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),))
于 2013-05-29T13:48:59.467 回答
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
于 2014-04-14T21:38:07.753 回答