我有一個網站其URL看起來像Django的:重複使用重定向代碼失蹤對象
http://www.example.com/NY-2010/
http://www.example.com/NY-2010/location/
http://www.example.com/Washington-2009/
等。各種版本(如紐約)有各種頁面(如位置)。我用的URLconf像
url(r'^(?P<edition>[\d]+\-[\w]+)/$', views.home),
url(r'^(?P<edition>[\d]+\-[\w]+)/location/$', views.location),
在每一個我不得不獲取當前版本的意見。事實是,如果版本名稱錯誤,我想重定向到最新版本。所以我做點類似
def home(request, edition):
try:
event = Edition.objects.get(name=edition)
except ObjectDoesNotExist:
return redirect(home, edition=Edition.latest())
# If event was found I go on here
def location(request, edition):
try:
event = Edition.objects.get(name=edition)
except ObjectDoesNotExist:
return redirect(home, edition=Edition.latest())
# If event was found I go on here
等等。當然,我想盡量減少一些重複。我能想到的方法有兩種:
- 使用
get_objects_or_404()
和自定義的404視圖,或 - 抽象函數中的公共部分。
這兩種方式的問題是,他們不允許我做一個適當的重定向,即即使視圖被改變,該URL將保持不變。有沒有更好的方法來處理這些重定向?
編輯看來我的問題並不清楚。特別是我不明白我的意思是抽象出一個函數中的共同部分。所以,我可以做的是我下面
def get_edition_or_current(edition):
try:
event = Edition.objects.get(name=edition)
except ObjectDoesNotExist:
event = Edition.latest()
return event
def home(request, edition):
event = get_edition_or_current(edition)
# I go on with a valid event here
def location(request, edition):
event = get_edition_or_current(edition)
# I go on with a valid event here
這樣可以顯示正確的事件的看法,但我無法改變的URL。要更改網址,該視圖必須返回重定向。我無法從get_edition_or_current
中設置視圖的返回值。
那麼,Django如何實現get_object_or_404
?好吧,這很簡單,它引發了一個Http404異常,並在稍後捕獲它。但是,這當然只適用於Http404異常,因爲Django被指示捕捉它們。
「中的功能抽象的共同部分」?你爲什麼不這樣做?定製404視圖將包含所有重複的邏輯,不是嗎? – 2011-04-25 17:11:57
要更改URL,我必須在視圖中返回重定向。如果我調用'someFunction()',我不能從'someFunction()'中返回一個重定向。我將不得不檢查它的返回值,以防萬一手動返回重定向,這比我現在做的要好。 – Andrea 2011-04-25 17:18:07
@Andrea:「如果我調用someFunction(),我不能從someFunction()中返回重定向」「?好的。我很困惑你認爲你可以通過「抽象函數中的公共部分」來消除什麼「重複」。現在你說你不能這樣做?但在你說的問題上你可以嗎?請澄清。 – 2011-04-25 17:20:31