문제

저는 콘테스트 앱을 작성 중입니다.콘테스트는 특정 날짜의 자정에 종료됩니다.앱이 다음에서 자동으로 전환되도록 하고 싶습니다.사용하여 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 그리고 뷰는 표시된 내용을 위임하는 작업을 수행합니다. 보다)

(이 예는 이에 따라 모델을 변경하고 올바른 라이브러리 등을 모두 가져오는 것을 의미합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top