2010-10-08 97 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