我有一个包含大量字段和 20000 多个表行的 Django 模型。为了促进人类可读的 URL 和将大列表分解为任意子列表的能力,我希望有一个如下所示的 URL:
/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....
其中“名称”映射到模型属性,“值”是该属性的搜索条件。每个“名称”都将被视为一个类别,以返回类别匹配的模型实例的子集。
现在,这可以使用 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 中每个可能的模型属性硬编码为可选 (.*) 模式的情况下实现这一点?