Как изменить представление, в которое разрешается URL-адрес после определенной даты?

StackOverflow https://stackoverflow.com//questions/23035462

Вопрос

Я пишу приложение для соревнований.Конкурс закрывается в полночь определенного дня.Я хочу, чтобы приложение автоматически переключалось с:используя CookieWizardView, от formtools;к нормальному TemplateView, из библиотеки общего представления.

В настоящее время соответствующая часть моих шаблонов 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)

Это помогает, теперь мой шаблон URL:

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()
Это было полезно?

Решение

Вам не нужно пытаться взломать свой 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