我有一个Django模型,包含大量字段和20000多个表行.为了方便人类可读的URL以及将大型列表分解为任意子列表的能力,我希望有一个如下所示的URL:
/browse// / / / .... etc ....
其中'name'映射到model属性,'value'是该属性的搜索条件.每个"名称"将被视为类别,以返回类别匹配的模型实例的子集.
现在,这可以用GET参数处理,但我更喜欢用户和搜索引擎更可读的URL.这些URL子集将嵌入显示此模型的每个页面上,因此制作漂亮的URL似乎是值得的.
理想情况下,每个名称/值对将作为名为name1
,name2
等的参数传递给视图函数.但是,我不相信可以通过正则表达式的匹配文本定义命名模式.我错了吗?
所以,似乎我需要做这样的事情:
urlpatterns = patterns('', url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"), )
看来这应该匹配任意两个名称/值对的集合.虽然它成功匹配,但它只将最后一个名称/值对作为参数传递给视图函数.我的猜测是每场比赛都会覆盖上一场比赛.在包含(?:...)+导致它的猜测下,我尝试了一个简单的重复模式:
urlpatterns = patterns('', url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"), )
...并且遇到了同样的问题,但这次*args
只包括最后匹配的模式.
这是Django的url调度程序和/或Python的正则表达式支持的限制吗?似乎这些方法中的任何一个都应该有效.有没有办法实现这一点,而无需将URL中的每个可能的模型属性硬编码为可选(.*)模式?
您可能考虑的可能性是匹配网址图案部分中的整个可能值字符串,并拉出视图中的特定部分.举个例子:
urlpatterns = patterns('', url(r'^browse/(?P.+)/$', 'app.views.view', name='model_browse'), ) def view(request, match): pieces = match.split('/') # even indexed pieces are the names, odd are values ...
没有关于我使用的正则表达式的承诺,但我想你明白我的意思.
(编辑试图修复正则表达式.)