【发布时间】:2011-09-15 16:54:51
【问题描述】:
给定两类实体,我将选择它们的某种交叉产品集,并具有以下 URL 定义:
url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$", view, {}, name="cross")
所以基本上像/category1/1,2,3,4/category2/5,6,7,8/ 这样的网址是有效的。
现在我在同一数据上引入了几个视图,所以现在我有像 /category1/1,2,3,4/category2/5,6,7,8/view1/ 和 /category1/1,2,3,4/category2/5,6,7,8/view2/ 这样的 URL。我想将“旧”网址重定向到view1。我没有发现比这更容易的事情了:
url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$",
redirect_to, {
'url': lazy(lambda: reverse(
'cross_view1',
kwargs={
'category1': '111111',
'category2': '222222',
}
).replace('111111', '%(category1)s') \
.replace('222222', '%(category2)s'), str)(),
name="cross"}
这里的重点是我想在 URL 中重用匹配的组,但是,我不能将它们作为 kwargs 提供给redirect_to,因为它们不会被插值,我也不能在 URL 中放置逐字格式因为它必须匹配我的正则表达式(逗号分隔的数字 ID)。所以我引入了一些唯一的 ID(本例中为 111111 和 222222),然后替换它们。
显然,这种感觉、外观、气味和味道都非常糟糕。除了引入额外的视图并完全跳过redirect_to 之外,还有什么更简洁的方法吗?
【问题讨论】:
-
想问一下(我是 Django 新手:我的大部分 Python 工作都是在 Turbogears 中完成的),但为什么
url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$", redirect_to, {'url': '/category1/%(category1)s/category2/%(category2)s/view1',})不工作? -
@Femi:因为我想重用我的 URL 构建方案。如果我改变它(这在这个阶段是完全可能的),我不需要追踪我可以使用 URL 连接的每个地方。 URL 反转也应该是 Django 开发的“干净”方式——正如我们从代码中看到的那样,这并不完全明显;)
-
为什么不能引入额外的视图?
-
@André Caron:这不是完全不可能的,无论如何我可能不得不介绍它,但是我想知道使用 Django 提供的通用视图的怪癖,尤其是它们与最佳实践的联系由 Django 推广并为 Django 推广。如果使用
redirect_to和reverse意味着编写像我写的那样丑陋的代码,那么除了非常简单的情况外,我不会费心使用redirect_to。如果还有其他方法,我想了解一下——因此提出了这个问题。 -
这看起来可能会回答你的问题:stackoverflow.com/questions/15706489/…
标签: python django coding-style