문제

다음과 같은 URL 패턴이 있습니다.

urlpatterns = (
    url(r'^$', list_titles, name='list'),
    url(r'^(?P<tag>[a-z\-0-9]+?)/$', list_titles, name='filtered-list'),
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
)

그만큼 filtered-list 그리고 title 똑같은 일을 일치시킵니다.

일치하는 물건의 목록이있는 경우 tag 안에 filtered-list, 원해요 list_titles 발사. 그러나 일치하지 않는다면 tag, 나는 URL 프로세서로 되돌아 가고 싶다. show_title 해고.

일치하는 제목이 없다면 적절한 404를 올릴 것입니다.

나는보기 내부에서 이것을 할 수 있다는 것을 알고 있습니다. 그러나 프로세스를보기에 열심히 와이어 해야하는 것은 약간 냄새가납니다. URL 주문이 무엇을 먼저 선택하는지, 무엇을 제공하는지 결정하기를 원합니다.

도움이 되었습니까?

해결책

이것은 확실히 뷰 논리입니다. 모든 urls.py는 유효성 검사를 수행하지 않고 URL 패턴을 일치시키는 것입니다. 당신은 사용할 수 있습니다 Http404 이것을 처리하려는 예외.

from django.http import Http404

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_response('polls/detail.html', {'poll': p})

또는 당신은 찾을 수 있습니다 get_object_or_404 또는 get_list_or_404 방법, 약간 단축됩니다.


약속 편집은 다음과 같습니다. 정확히 당신이 찾고있는 것이 아니라 ...

urlpatterns = (
    url(r'^$', list_titles, name='list'),
)

if 1=1: # Your logic here
    urlpatterns += ( url(r'^$', list_titles, name='list'), )

urlpatterns += (
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
    url(r'^spam/$', spam_bar),
    url(r'^foo/$', foo_bar),
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top