특정 날짜 이후에 URL이 확인되는 보기를 어떻게 변경합니까?
-
21-12-2019 - |
문제
저는 콘테스트 앱을 작성 중입니다.콘테스트는 특정 날짜의 자정에 종료됩니다.앱이 다음에서 자동으로 전환되도록 하고 싶습니다.사용하여 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)
이것이 트릭입니다. 이제 내 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
그리고 뷰는 표시된 내용을 위임하는 작업을 수행합니다. 보다)
(이 예는 이에 따라 모델을 변경하고 올바른 라이브러리 등을 모두 가져오는 것을 의미합니다.)
제휴하지 않습니다 StackOverflow