1

我正在寫一個比賽應用程序。比賽在特定日期的午夜結束。我想讓應用程序自動從以下位置切換:使用CookieWizardView,從formtools;從通用視圖庫到正常的TemplateView如何更改某個URL在某個日期後解析的視圖?

目前我的URL模式相關的部分看起來像這樣:

urlpatterns += patterns('', 
    url(r'^$', 'appname.views.contest'), # the CookieWizardView 
) 

,我想它,在一定日期後,充當雖然它看起來像這樣:

urlpatterns += patterns('', 
    url(r'^$', 'appname.views.contestclosed'), # a TemplateView 
) 

我完全是,完全是罰款有一個硬編碼的魔術數字,我只是不想在當天午夜起牀!

~~

我解決了這個,但不能回答我的問題,因爲我太新。

我在views.py做了一個功能:

def contest_switcher(request): 
    if datetime.datetime.now() < datetime.datetime(YEAR_OVER, MONTH_OVER, DAY_OVER): 
     return contest(request) 
    else: 
     return contestclosed(request) 

這確實的伎倆,現在我URLPATTERN是:

urlpatterns += patterns('', 
    url(r'^$', 'appname.views.contest_switcher'), 
) 

我也有我的比賽封閉視圖中添加的功能,雖然,因爲它不期望發佈POST,如果有人在半夜試圖填寫比賽表格,可能會發生這種情況:

class ContestClosedView(TemplateView): 
    template_name = "appname/closed.html" 

    def post(self, *args, **kwargs): 
     return self.get(*args, **kwargs) 

contestclosed = ContestClosedView.as_view() 
+2

爲什麼你不只是比較視圖本身的日期,並變更爲模板呈現(並與什麼上下文)?? –

回答

2

您不必嘗試破解您的urls.py即可解決此問題。設置指向看起來像這樣一個觀點一個URL模式:

def contest_page(request, contest_id): 
    try: 
     contest = Contest.objects.get(pk=contest_id) 
    except Contest.DoesNotExist: 
     raise Http404 # minimum necessary - you can do better 
    if datetime.datetime.now() < contest.end_date: # model field rather than module constants 
     return contest(request, contest_id) # CookieWizardView 
    else: 
     return contestclosed(request, contest_id) # TemplateView 

這基本上是你的contest_switcher與改進:

  • 適用於多個比賽
  • 比賽知道自己的結束日期,讓你不要使用常量
  • 簡單urls.py混亂你的模塊示波器和視圖做的工作,委託所示(你知道,視圖

(注意,這個例子表明您會相應地改變你的模型,並導入所有正確的庫和等)。

+0

哈哈很好,這是關於模型領域的一個好點! – 0sn

相關問題