Как изменить представление, в которое разрешается URL-адрес после определенной даты?
-
21-12-2019 - |
Вопрос
Я пишу приложение для соревнований.Конкурс закрывается в полночь определенного дня.Я хочу, чтобы приложение автоматически переключалось с:используя 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
и представление выполняет работу по делегированию того, что показано (вы знаете, вид)
(Обратите внимание, что этот пример подразумевает, что вы соответствующим образом измените свои модели и импортируете все правильные библиотеки и тому подобное.)