Django를 사용하여 현재 URL 이름을 얻는 방법은 무엇입니까?


90

현재 URL에 따라 동적으로 URL을 작성해야합니다. {% url %}태그를 사용하는 것이 가장 쉬운 방법이지만 새 URL을 동적으로 생성하려면 현재 URL 이름이 필요합니다.

현재보기로 연결되는 urlconf에 첨부 된 URL 이름을 어떻게 얻을 수 있습니까?

편집 : 나는 수동으로 URL을 사용할 수 있다는 것을 알고 get_absolute_url있지만 강의의 일부이므로 URL을 작성하는 한 가지 방법 만 보여주고 싶습니다.

학생들은 사용 방법을 알고 있습니다 {% url %}. 그들은 현재 URL을 기반으로보다 완전한 URL을 생성해야 할 때 문제에 직면하고 있음을 알고 있습니다. 가장 쉬운 방법은 {% url %}몇 가지 변형 을 사용하여 다시 사용하는 것입니다 . url이라는 이름을 지정 했으므로 현재 뷰를 호출 한 URL의 이름을 얻는 방법을 알아야합니다.

편집 2 : 또 다른 사용 사례는 기본 템플릿에 따라 기본 템플릿의 일부를 다르게 표시하는 것입니다. 다른 방법이 있습니다 (CSS 및 {% block %} 사용).하지만 뷰 이름이 링크와 일치하면 base.html 메뉴 항목의 태그를 제거 할 수있는 것이 좋습니다.


6
템플릿 태그를 통해 현재의 절대 URL 을 출력하는 방법을 검색하는 동안이 질문을 계속 찾았습니다.이 질문도 찾고 있다면 다음과 같습니다.{{ request.get_full_path }}
Dolph

답변:


134

이 기능이 얼마나 오랫동안 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

왜? 내가 귀하의 질문을 이해하는 한, 그 질문의 중요한 부분은 "URL 이름을 지정 했으므로 현재보기를 호출 한 URL 이름을 가져 오는 방법을 알아야합니다."를 달성하는 방법이었습니다 ...
Lukas Bünger 2012-01-16

1
실제로 lukas 그날 나는 심술 궂고 당신의 대답을 임의로 완전히 버렸습니다. 이것이 실제로 정답이기 때문에 죄송합니다. 나는 그것을 더 명확하게 만들기 위해 그것을 편집 할 것입니다.
e-satis 2012 년

8
resolve()쿼리 문자열을 전달하고 단순히 404를 발생 시키면 해결할 수 없습니다 get_full_path(). 경로와 쿼리 문자열을 반환합니다. 을 사용해야 resolve(request.path_info)합니다.
캔 부락 Çilingir

current해결해야하는 URL이 아니라 사용자가 리디렉션 할 URL 이면 어떻게 됩니까? 이를 수행하는 더 일반적인 방법은 무엇입니까? Conley Owens의 대답에는 단서가 있지만 휠이 이미 Django에 존재한다면 휠을 재발 명하지 않을 것입니다.
Hassan Baig

이것은 i18n_patterns가있는 번역 가능한 URL에서 작동하지 않는 것 같습니다
guival

109

Django 1.5부터 요청 객체에서 액세스 할 수 있습니다.

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match


내가 이것을 컨텍스트 프로세서에 넣었을 때 작동했지만이 이상한 오류가 콘솔에 표시되었습니다.AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
fjsj

2
'resolver_match'는 모든 요청 미들웨어를 호출 한 후에 만 ​​요청 객체에 추가됩니다. URL이 해결되는 때입니다. 따라서 미들웨어보기에서만 액세스 할 수 있습니다. (미들웨어의 process_view 기능). 요청 미들웨어 기능에서는 사용할 수 없습니다. (미들웨어의 process_request 기능).
Bharathwaaj 2013

.view_name네임 스페이스가 필요한 경우

27

URL 패턴의 네임 스페이스를 지정하는 사람들의 경우 요청의 네임 스페이스가 지정된 URL 이름에 관심이있을 수 있습니다. 이 경우 Django는 view_name대신 호출했습니다 .

request.resolver_match.view_name

# return: <namespace>:<url name>

감사합니다. 그러나 이것은 @ dariusz-niespodziany의 이전 답변의 속임수입니다. stackoverflow.com/a/31931833/1450294
Michael Scheper

5
네임 스페이스를 지정하지 않은 경우 urls.py@ dariusz-niespodziany를 즉시 reverse사용할 수 있습니다. 그러나 네임 스페이스를 사용하는 경우 resolver_match.url_name직접 reverse사용할 수 없습니다 . 따라서 네임 스페이스를 직접 추가해야합니다. 따라서 직접 수행하는 대신 Django .view_name는 초기화시 이미 설정했습니다 .
Yeo

15

이는 다음을 통해 달성 할 수 있습니다.

    request.resolver_match.url_name

장고> 1.8


4

질문에 대한 설명 : "뷰에서 이러한 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의 이름을 알아야 할 수도 있습니다.




1

질문에서 약간 불분명하지만 http://docs.djangoproject.com/en/dev/topics/http/urls/ 는 당신이 추구하는 것에 대한 설명을 제공 할 것입니다.

Django가 요청을 처리하는 방법을 기록하는 데 특히 유용합니다.

사용자가 Django 기반 사이트에서 페이지를 요청하면 실행할 Python 코드를 결정하기 위해 시스템이 따르는 알고리즘입니다.

  1. Django는 사용할 루트 URLconf 모듈을 결정합니다. 일반적으로 이것은 ROOT_URLCONF 설정의 값이지만 들어오는 HttpRequest 개체에 urlconf (미들웨어 요청 처리에 의해 설정 됨)라는 속성이있는 경우 ROOT_URLCONF 설정 대신 해당 값이 사용됩니다.
  2. Django는 해당 Python 모듈을로드하고 변수 urlpatterns를 찾습니다. django.conf.urls.defaults.patterns () 함수가 반환하는 형식의 Python 목록이어야합니다.
  3. Django는 각 URL 패턴을 순서대로 실행하고 요청 된 URL과 일치하는 첫 번째 패턴에서 중지합니다.
  4. 정규식 중 하나가 일치하면 Django는 간단한 Python 함수 인 주어진 뷰를 가져 와서 호출합니다. 뷰는 첫 번째 인수로 HttpRequest를 전달하고 나머지 인수로 정규식에 캡처 된 모든 값을받습니다.

전체 경로 바로 뒤에있는 경우 다음을 시도 할 수 있습니다.

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

이것이 도움이되기를 바랍니다. URLconf 모듈을 사용하는 방법을 나타내며 올바른 방향으로 안내하는 데 도움이되기를 바랍니다.


감사합니다.하지만 저는 알고 있습니다 :-) 오해를 피하기 위해 몇 가지 설명을 추가했습니다.
e-satis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.