현재 URL에 따라 동적으로 URL을 작성해야합니다. {% url %}
태그를 사용하는 것이 가장 쉬운 방법이지만 새 URL을 동적으로 생성하려면 현재 URL 이름이 필요합니다.
현재보기로 연결되는 urlconf에 첨부 된 URL 이름을 어떻게 얻을 수 있습니까?
편집 : 나는 수동으로 URL을 사용할 수 있다는 것을 알고 get_absolute_url
있지만 강의의 일부이므로 URL을 작성하는 한 가지 방법 만 보여주고 싶습니다.
학생들은 사용 방법을 알고 있습니다 {% url %}
. 그들은 현재 URL을 기반으로보다 완전한 URL을 생성해야 할 때 문제에 직면하고 있음을 알고 있습니다. 가장 쉬운 방법은 {% url %}
몇 가지 변형 을 사용하여 다시 사용하는 것입니다 . url이라는 이름을 지정 했으므로 현재 뷰를 호출 한 URL의 이름을 얻는 방법을 알아야합니다.
편집 2 : 또 다른 사용 사례는 기본 템플릿에 따라 기본 템플릿의 일부를 다르게 표시하는 것입니다. 다른 방법이 있습니다 (CSS 및 {% block %} 사용).하지만 뷰 이름이 링크와 일치하면 base.html 메뉴 항목의 태그를 제거 할 수있는 것이 좋습니다.
답변
이 기능이 얼마나 오랫동안 Django의 일부 였는지는 모르겠지만 다음 기사 에서 볼 수 있듯이 뷰에서 다음과 같이 달성 할 수 있습니다.
from django.core.urlresolvers import resolve
current_url = resolve(request.path_info).url_name
모든 템플릿에 필요한 경우 템플릿 요청을 작성하는 것이 적절할 수 있습니다.
편집 : 새로운 DJANGO 업데이트 적용
현재 Django 업데이트에 따라 :
Django 1.10 ( 링크 )
django.core.urlresolvers
모듈 에서 가져 오기 는 새로운 위치를 위해 더 이상 사용되지 않습니다.django.urls
Django 2.0 ( 링크 )
django.core.urlresolvers
모듈은 새로운 위치에 찬성 제거됩니다django.urls
.
따라서 올바른 방법은 다음과 같습니다.
from django.urls import resolve
current_url = resolve(request.path_info).url_name
답변
Django 1.5부터 요청 객체에서 액세스 할 수 있습니다.
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match
답변
URL 패턴의 네임 스페이스를 지정하는 사람들의 경우 요청의 네임 스페이스가 지정된 URL 이름에 관심이있을 수 있습니다. 이 경우 Django는 view_name
대신 호출했습니다 .
request.resolver_match.view_name
# return: <namespace>:<url name>
답변
이는 다음을 통해 달성 할 수 있습니다.
request.resolver_match.url_name
장고> 1.8
답변
질문에 대한 설명 : “뷰에서 이러한 urlpattern이 정확히 하나 있다고 가정 할 때이를 가리키는 urlpattern의 이름을 어떻게 얻습니까?”
이는 다음과 같은 이유 때문에 바람직 할 수 있습니다. 뷰 내에서 동일한 뷰에 대한 URL을 가져 오는 DRY 방식을 원합니다 (우리 자신의 urlpattern 이름을 알고 싶지 않음).
짧은 대답 : 수업을 가르치는 것은 정말 간단하지 않지만 한두 시간 안에 GitHub에 토하는 것은 재미있는 일이 될 수 있습니다.
이 작업을 정말로 수행하려면 RegexURLResolver를 하위 클래스로 만들고 resolve 메서드를 수정하여보기 및 키워드 / 값 쌍 대신 일치하는 패턴 (패턴 이름을 가져올 수 있음)을 반환해야합니다.
http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
그런 다음이 서브 클래스를 사용하여 패턴 이름을 얻고 뷰가 사용할 수 있도록 요청의 어딘가에 해당 값을 저장하는 데코레이터 또는 아마도 더 적절하게 미들웨어를 만들 수 있습니다.
실제로 그렇게하고 싶은데 문제가 발생하면 알려 주시면 도움을 드릴 수 있습니다.
수업의 경우보기 또는 템플릿에서 패턴 이름을 하드 코딩하도록합니다. 나는 이것이 허용되는 방법이라고 믿습니다.
업데이트 :
이것에 대해 더 많이 생각할수록 뷰에서 urlpattern 이름을 얻으려는 시도를 더 많이 권장하지 않습니다. urlpattern 매개 변수는 그들이 가리키는 뷰의 매개 변수와 상당히 독립적입니다. 특정 URL을 가리 키려면보기가 작동하는 방식뿐만 아니라 urlpattern이 작동하는 방식을 알아야합니다. urlpattern의 작동 방식을 알아야하는 경우 urlpattern의 이름을 알아야 할 수도 있습니다.
답변
그냥 시도하십시오 request.path
. 요청중인 현재 경로를 가져옵니다.