2009-03-18 4 views
13

아래와 같이 URLconf가 있으며 'foo''bar'page_slug에 대한 유효한 값이라고 가정합니다.추가 옵션이 포함 된 Django URL 반전

urlpatterns = patterns('', 
    (r'^page/(?P<page_slug>.*)/', 'myapp.views.someview'), 
) 

그런 다음 아래 URL을 사용하여 URL을 재구성 할 수 있습니까?

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/page/foo/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/page/bar/' 

하지만 URLconf를 어떻게 변경합니까?

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/foo-direct/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/my-bar-page/' 

그러나, 이것은 NoReverseMatch 예외가 발생합니다 :

urlpatterns = patterns('', 
    (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}), 
    (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}), 
) 

나는이 결과를 기대했다. 나는 무언가를하려고 노력하고 있다고 생각합니다. 내가 원하는 것을 성취 할 수있는 더 좋은 방법에 대한 제안?

명명 된 URL은 URL 구조의 세부 사항 (캡슐화 및 모든 것)에 대해 알아야 할 링크가있는 다른 앱을 원하지 않기 때문에 옵션이 아닙니다.

+0

을 의미합니까? 에러 메시지? 그렇다면, 무엇? –

+0

'NoReverseMatch' 예외를 throw합니다. –

+0

새 사실로 질문을 업데이트하십시오 - 유용한 정보를 주석으로 추가하지 마십시오. –

답변

7

우리가하는 바는 다음과 같습니다.

urls.py이

object = SomeModel.objects.get(...) 
    url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name}) 
+0

이름 충돌 문제에 도움이되지 않는다고 생각합니다. –

+0

원래 David의 말 때문에 나는 당신을 다운 받았다.하지만 실제로 저스틴의 질문에 답하는 것처럼 보입니다. 나는 여전히 데이빗의 대답이 "더 나은"것이라고 생각하지만, 당신의 가능성은 가능성이 있습니다. – Tyson

+0

어쩌면 나는 이것이 처음 읽는 위에서 어떻게 적용되는지 이해하지 못했을 것입니다. 나는 그것이 작동 할 수있는 것처럼 보입니다. 그러나 모델 레벨에서 URL 이름에 대한 참조를 넣는 것만으로도 가능합니다. object_1.datarealm.name = 'foo-direct'이게 작동하면 object_1.datarealm.name = 'foo'이면됩니다. –

4

명명 된 URL을 같은 역 호출 등이

url(r'^(?P<datarealm>.*?)/json/someClass/(?P<object_id>.*?)/$', 'json_someClass_resource',), 

views.py 같은 패턴을 가지고는 옵션이 될해야한다. 귀하의 경우는 장고 참조 강조 :

http://docs.djangoproject.com/en/dev/topics/http/urls/?from=olddocs#id2

내가 디자이너가 주위에 일 또 다른 왼쪽 확실하지 않다; 그들은 그것을 지킬 이름의 URL을 기대했다.

캡슐화에 대해 질문 할 수 있습니까? 감사. 두 가지 이유가 있습니다 : - 아무도 은 세부 사항보고

  • 보안를 원 -

    1. 추상화 아무도 세부 사항을 볼해야한다, 당신이 할 수있는 일에 관해서는

    파이썬에서 적당한 마일리지를 얻으십시오. 장고는 훌륭한 예입니다. 2는 해석 언어입니다. 작성된 곳에서 실행 중이거나 컴파일 된 .pyc 파일에서 발송 중입니다. 그것이 정말로 당신이하고있는 것이라면, url conf를 컴파일하십시오.

    마지막으로, 다른 응용 프로그램이 URL 구조보다 기능에 대해 알 수 있도록 캡슐화되지 않은 것 같습니다. 그러나 당신이 정말로 동의하지 않는다면, 나는 좀 더 유연한 역 방법을 직접 구현해야한다고 생각합니다.

  • +0

    동의; 명명 된 URL을 API로 내보내는 것은 뷰 함수 이름을 내보내는 것과 마찬가지로 "캡슐화"됩니다. –

    +1

    # 2 - 모호성을 통한 보안? : – monokrome

    +0

    링크가 오래되었다고 생각합니다. 어떤 섹션을 링크하고 싶습니까? –

    19

    urlconfs의 이름을 지정해야합니다. 예 :

    urlpatterns = patterns('', 
        url(r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}, name='foo-direct'), 
        url(r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}, name='bar-page'), 
    ) 
    

    그런 다음 반전을 편집하면 제대로 작동해야합니다.에서

    >>> from django.core.urlresolvers import reverse 
    >>> reverse('foo-direct', kwargs={'page_slug': 'foo'}) 
    '/foo-direct/' 
    >>> reverse('bar-page', kwargs={'page_slug': 'bar'}) 
    '/my-bar-page/' 
    

    상세 정보 : 당신은 "작동하지 않습니다"무엇을 Django Docs

    +0

    이 질문은 URL의 conf와 정확히 어떻게 관련이 있습니까? (r '^ page/(? P . *)/','myapp.views.someview '),? – Rexford