有時你有一個模式來處理在你的URLconf中的一系列URL,但是有時候需要特別處理其中的某個URL。 在這種情況下,要使用將URLconf中把特殊情況放在首位的線性處理方式 。
比方說,你可以考慮通過下面這個URLpattern所描述的方式來向Django的管理站點添加一個目標頁面
urlpatterns = patterns('', # ... ('^([^/]+)/([^/]+)/add/$', views.add_stage), # ...)這將匹配像 /myblog/entries/add/ 和 /auth/groups/add/ 這樣的URL 。然而,對于用戶對象的添加頁面( /auth/user/add/ )是個特殊情況,因為它不會顯示所有的表單域,它顯示兩個密碼域等等。 我們 可以 在視圖中特別指出以解決這種情況:
def add_stage(request, app_label, model_name): if app_label == 'auth' and model_name == 'user': # do special-case code else: # do normal code
不過,就如我們多次在這章提到的,這樣做并不優雅: 因為它把URL邏輯放在了視圖中。 更優雅的解決方法是,我們要利用URLconf從頂向下的解析順序這個特點:
urlpatterns = patterns('', # ... ('^auth/user/add/$', views.user_add_stage), ('^([^/]+)/([^/]+)/add/$', views.add_stage), # ...)在這種情況下,象 /auth/user/add/ 的請求將會被 user_add_stage 視圖處理。 盡管URL也匹配第二種模式,它會先匹配上面的模式。 (這是短路邏輯。)
新聞熱點
疑難解答
圖片精選