2009-08-27 65 views
0
url(r'^([a-zA-Z0-9/_-]+):p:(?P<sku>[a-zA-Z0-9_-]+)/$', 'product_display', name='product_display'), 
url(r'^(?P<path>[a-zA-Z0-9/_-]+)$', 'collection_display', name='collection_display'), 

這就是我目前的正則表達式破譯動態URL法寶:如何在Django

我的問題是這樣的:我希望能夠在不使用匹配product_display的正則表達式:P:在正則表達式。我可以通過將.html放在最後以將其與c​​ollection_display的正則表達式分開來做到這一點,但這並不能解決問題;如果沒有正則表達式中的「some-collection/other/other/sku.html」這個URI上面的「:p:」,就會將正則表達式一直匹配到「.html」,忽略sku。我如何做到這一點,而不使用「:p:」來結束收集正則表達式。任何事情都會有幫助。

感謝

+0

只是一個提示,重構一個-ZA-Z0-9/_-成一個字符串對象,所以你可以重複使用它乾淨 – aehlke 2009-08-27 19:17:21

回答

1

它看起來像你的SKU不能包含斜線,所以我會建議使用「/」作爲分隔符。然後可以使用「.html」技巧;事實證明,你的正則表達式collection_display不符點,但絕對確保,你可以使用一個負向後看:

url(r'^([a-zA-Z0-9/_-]+)/(?P<sku>[a-zA-Z0-9_-]+)\.html$', 'product_display', name='product_display'), 
url(r'^(?P<path>[a-zA-Z0-9/_-]+)(?<!\.html)$', 'collection_display', name='collection_display'), 

或者,總是用「斜線和product_display結束你collection_display網址.html「(反之亦然)。

+0

與唯一的問題是,我用這個作爲我目前正則表達式: url(r'^([a-zA-Z0-9/_-] +)/(?P [a-zA-Z0-9 _-] +)。html $','product_display',name ='我有([a-zA-Z0-9/_-] +)/在開始,因爲該網址可以是任何東西,只要它具有somesku.html在最後,我希望能夠將sku拉出(從點回到最後一個斜線)。這是因爲我希望下面幾點是可能的: http://mysite.com/collection/sub-collection/ (集合匹配) http://mysite.com/collection/sub-collection/sku.html (與sku匹配) – orokusaki 2009-08-29 17:41:43

+0

這不正是示例答案的作用嗎?那麼問題是什麼? – eswald 2009-08-30 01:41:55

+0

絕對不是。他建議使用斜槓作爲我的分隔符。我無法傳入完整路徑(包括斜線),直到最後一個斜槓,並且同時使用斜線作爲我的分隔符。消極後視是實現這一目標的唯一方式,而框架中缺乏支持就是爲什麼如此多的網絡應用程序在他們的URL中使用冒號和圖表。 – orokusaki 2009-12-15 06:57:34