2010-10-08 102 views
0

我已经定义为路由如下不太具体:Django的反向路由 - 溶液到外壳,其中反向路由比向前路由

(r'^edit/(\d+)/$', 'app.path.edit') 

我想使用的反向功能如下:

url = reverse('app.path.edit', args=('-id-',)) 

生成的url被传递给一个js函数,客户端代码最终将用正确的数字id替换'-id-'。这当然不会起作用,因为'reverse'函数与路由不匹配,因为url被定义为包含数字参数。

我可以改变路线,以接受任何类型的参数如下,但后来我宽松一些特殊性:

(r'^edit/(.+)/$', 'app.path.edit' 

我可以创建所显示的每个项目一个单独的网址,但我会展示列表中的很多项目,因此,为每个项目包含完整的url似乎浪费了带宽。

有没有更好的策略来完成我想要做的事情?

回答

1

可以重写正则表达式是这样的:

(r'^edit/(\d+|-id-)/$', 'app.path.edit') 

但我一般喜欢这样的:

(r'^edit/([^/]+)/$', 'app.path.edit') # you can still differ "edit/11/" and "edit/11/param/" 

通常你反正需要检查实体存在与get_object_or_404快捷方式或类似的,所以只能不好的一面是你必须对传入的数据更准确,因为id可以包含几乎任何字符。

1

在我看来,更简单的解决方案是保留原始网址,然后传递值'0'而不是'-id-'。在客户端,然后用正确的ID替换'/ 0 /'。我认为这样更好,因为它不会掩盖网址路由,并且不会失去特异性。

+0

但/ 0 /也可能是一个有效的ID,所以不清楚/ 0 /是一个占位符还是一个ID。 – limscoder 2010-10-10 15:54:41

+0

是的,在我的情况下可以使用它,因为ID是数据库的自动增量主键。 – 2010-10-11 17:07:24