我正在写一个比赛应用程序。比赛在特定日期的午夜结束。我想让应用程序自动从:使用 CookieWizardView, ,从 formtools;到正常 TemplateView, ,来自通用视图库。

目前我的urlpatterns的相关部分如下所示:

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'),
)

不过,我确实不得不在我的比赛封闭视图中添加一个功能,因为它并不期待一个帖子,如果有人试图在午夜填写比赛表格,就会发生这种情况:

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

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

contestclosed = ContestClosedView.as_view()
有帮助吗?

解决方案

你不必试图破解你的 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 视图负责委派所显示的内容(你知道, 查看)

(请注意,此示例意味着您将相应地更改模型并导入所有正确的库等。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top