2010-06-28 50 views
0

我的項目中的大多數視圖接受可選的用戶名參數,如果存在,請過濾傳遞給該用戶模板的查詢集。因此,舉例來說:DRYness的Django url配置

索引視圖處理以下兩個URL模式:

'^$' # general index page 
'^(?P<username>[-\w]+)/$' # index page for the user 

'^photos/$' # photo index page 
'^(?P<username>[-\w]+)/photos/$' # photos for that user 
... 

由於有許多這樣的應用中,它似乎並不很乾通過複製來實現相同的邏輯圖案。我認爲這是可能的遞歸包括主urls.py模塊,所以我這樣做:

url(r'^(?P<username>[-\w]+)/', include('urls')), 

我的理由是,當包含其他URL模塊,匹配模式是從路徑刪除。所以,我希望

'^(?P<username>[-\w]+)/photos/$' 

將成爲

'^photos/$' 

當它是由遞歸包含的URL匹配模塊,具有額外的username參數。但是這導致開發服務器在發出請求時靜靜地死去。

我能想到的第二種方法是編寫一箇中間件,它將匹配url中的模式(如果存在),並將查看的用戶添加到請求中,並從請求路徑中刪除與用戶名匹配的部分。但我不想搗亂這條路,因爲這可能會有不可預測的結果。

你會推薦什麼?我對DRYness太挑剔了嗎?

感謝, OMAT

回答

1

只要定義正則表達式是在同一個文件一個字符串,並已經使用字符串連接!

user_regex = r"^(?P<username>[-\w]+)/" 

然後,你可以做正則表達式'%s/photos$'%user_regex讓你保持只定義一次正則表達式,非常乾燥。雖然'您在url標記中包含urls.py模式的推理是正確的,但我不確定它爲什麼失敗。也許有其他一些錯誤?

+0

謝謝,它會幫助更乾淨的模式,但在實際情況下,每個應用程序都有自己的urls.py文件,其中包括。因此,對於每個應用程序,應將所有模式複製到他們自己的urls.py中,並使用與用戶名匹配的備選方案。 – omat 2010-06-29 13:24:11

+0

除了重複之外,由於應用網址包含爲'(r'^ photo /',include('photos.urls'))',用戶照片的網址爲'/ photo/[username] /'。 – omat 2010-06-29 13:37:13