장고에서 reverse () 무엇입니까


219

가끔 장고 코드를 읽을 때 일부 템플릿에서 볼 수 reverse()있습니다. 이것이 무엇인지 잘 모르겠지만 HttpResponseRedirect와 함께 사용됩니다. 언제 어떻게 reverse()사용해야합니까?

누군가가 몇 가지 예를 들어 대답하면 좋을 것입니다 ...


26
URL 패턴이 주어지면 Django는 url ()을 사용하여 올바른보기를 선택하고 페이지를 생성합니다. 즉 url--> view name. 그러나 때로는 리디렉션 할 때와 같이 역방향으로 이동하여 Django에보기 이름을 지정해야하며 Django는 적절한 URL을 생성합니다. 즉, view name --> url. 즉, reverse()(url 함수의 반대입니다). 전화를하는 generateUrlFromViewName것이 더 투명 해 보일 수도 있지만 너무 길고 일반적이지 않을 수도 있습니다. docs.djangoproject.com/en/dev/topics/http/urls/…
eric

4
@neuronet 훌륭한 설명 감사합니다. 이 이름은 특히 직관적이지 않은 것처럼 보였습니다. 불필요한 난독 화를 싫어하는 사람은 누구입니까?
mike 설치류

이것은 프로그래머가 자신의 상황을 고려했을 때 가장 중요했던 실체 (예 : 기능)의 한 측면을 강조하는 전형적인 네이밍 예제입니다. 그러나 다른 개발자의 광범위한 맥락에서 가장 유용한 옵션은 아닙니다. . 우리는 종종 프로그래머 로서이 함정에 빠지게됩니다. 이름 지정은 발견 가능성에 매우 중요합니다. 다른 상황에 대해 멈추고 생각하고 가장 적절한 것을 선택하는 것이 좋습니다.
Cornel Masson

답변:


347

reverse()| 장고 문서


urls.py당신이 이것을 정의 했다고 가정 해 봅시다 .

url(r'^foo$', some_view, name='url_name'),

그런 다음 템플릿에서이 URL을 다음과 같이 참조 할 수 있습니다.

<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>

<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>

이것은 다음과 같이 렌더링됩니다 :

<a href="/foo/">link which calls some_view</a>

이제 당신이 비슷한 것을하고 싶다고 말하십시오 views.py-예를 들어 /foo/다른보기 (not some_view) 에서 다른 url (not )을 처리 하고 사용자를 리디렉션 /foo/하는 경우 (종종 성공적인 양식 제출의 경우).

당신은 할 수 있습니다 :

return HttpResponseRedirect('/foo/')

그러나 나중에 URL을 변경하려면 어떻게해야합니까? 코드에서 귀하 urls.py 모든 참조 를 업데이트 해야합니다. 이것은 한 장소 만 편집한다는 전체 아이디어 인 DRY (Do n't Repeat Yourself)를 위반 하는 것입니다.

대신 다음과 같이 말할 수 있습니다.

from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))

이것은 프로젝트에 정의 된 모든 URL을 통해 이름으로 정의 된 URL을 찾고 url_name실제 url을 반환합니다 /foo/.

이것은 당신이 그 name속성에 의해서만 URL을 참조한다는 것을 의미합니다. 만약 당신이 URL 자체 또는 그것이 참조하는 뷰를 변경하고자한다면 한 곳만 편집함으로써 이것을 할 수 있습니다 urls.py.


3
참고 로 장고 1.4 또는 그 이전 버전 {{ url 'url_name' }}이어야합니다 {% url url_name %}. 이것은 다음 Django 릴리스 (1.5)에서 변경 될 예정 {% url 'url_name' %}입니다. 에 대한 문서 의 URL templatetag 주고 좋은 정보는 당신이 "상위 호환성"부분을 약간 아래로 스크롤하면
j_syk

1
j_syk 덕분에-1.3이 나온 이후 future @에서 @load url을 해왔으며 아직 기본값이 아님을 잊었습니다. 나는 경험이없는 사람들을 위로하지 않도록 답변을 업데이트 할 것입니다.
scytale

2
고정 - 나는 더 보면 자신이 그래서 그냥 :-) 점프 다른 사람의 답변에 편집 바보 오타에 당신을 위해 완전히 적합하다고 간주되는 것 같아요
스키 테일

3
이 사이트에서 찾을 수있는 가장 미묘한 답변 중 하나입니다.
Manas Chaturvedi

1
">>>하지만 나중에 URL을 변경하고 싶다면 어떻게해야합니까?" 모범 사례 '와 혼란을 남겨주세요. TBH 나중에 URL을 변경할 때 전역 찾기 대체를 수행하십시오. 이 솔루션 (url_name 사용)조차도 '앞으로 url_name을 변경하려면 어떻게해야합니까?'라는 문제가 발생하기 쉽습니다. 장고에서 5 년 이상 코딩을 해왔지만 아직까지의 요구를 충족시키지 못했습니다 url_reverse. 이러한 종류의 이상한 문제를 처리하는 가장 좋은 방법은 사용을 거부하는 것입니다.
nehem

10

이것은 오래된 질문이지만 여기에 누군가를 도울 수있는 것이 있습니다.

공식 문서에서 :

Django는 URL이 필요한 여러 레이어와 일치하는 URL 반전을 수행하기위한 도구를 제공합니다. 템플릿 : url 템플릿 태그 사용. Python 코드에서 : reverse () 함수 사용. Django 모델 인스턴스의 URL 처리와 관련된 상위 레벨 코드 : get_absolute_url () 메소드.

예 : 템플릿 (URL 태그)

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

예 : 파이썬 코드에서 ( reverse함수 사용)

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

1
전체 설명 보스 필요
giveJob

OP는 구체적으로 문서를 읽었으며 문서의 복사 / 붙여 넣기가 아니라 설명이 필요하다고 언급했습니다.
RusI

8

기존의 대답은 설명에서 훌륭한 일을 한 어떤 이의 reverse()장고 기능.

그러나, 나는 내 대답에 다른 되거 기대했던 이유 : 사용하는 이유 reverse()템플릿보기에서 다른 더 간단, 틀림없이 더 파이썬 방식 대신 바인딩,이 "리디렉션의 인기에 대한 몇 가지 합법적 인 이유가 무엇인가 를 통해 reverse() 장고 라우팅 로직에서

한 가지 주요 이점은 다른 사람들이 언급했듯이 URL의 역 구성입니다. {% url "profile" profile.id %}앱의 URL 구성 파일에서 URL을 생성 하는 방법과 같이 : 예를 들어 path('<int:profile.id>/profile', views.profile, name="profile").

그러나 OP가 언급했듯이의 사용은 reverse()일반적으로의 사용과 결합됩니다 HttpResponseRedirect. 그런데 왜?

이것이 무엇인지 잘 모르겠지만 HttpResponseRedirect와 함께 사용됩니다. 이 reverse ()는 언제 어떻게 사용됩니까?

다음을 고려하십시오 views.py.

from django.http import HttpResponseRedirect
from django.urls import reverse

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected = question.choice_set.get(pk=request.POST['choice'])
    except KeyError:
        # handle exception
        pass
    else:
        selected.votes += 1
        selected.save()
        return HttpResponseRedirect(reverse('polls:polls-results',
                                    args=(question.id)
        ))

그리고 우리의 최소한 urls.py:

from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path('<int:question_id>/results/', views.results, name='polls-results'),
    path('<int:question_id>/vote/', views.vote, name='polls-vote')
]

vote()함수에서 else블록 의 코드 는 다음 패턴 reverse과 함께 사용 됩니다 HttpResponseRedirect.

HttpResponseRedirect(reverse('polls:polls-results',
                                        args=(question.id)

가장 먼저, 우리는 URL을 하드 코딩 할 필요가 없지만 (DRY 원칙에 따라) 더 중요하게 reverse()는 인수에서 압축되지 않은 값을 처리하여 URL 문자열을 구성하는 우아한 방법을 제공합니다 ( args=(question.id)URLConfig에서 처리). value를 포함 question하는 속성 id이 있다고 가정 5하면 URL reverse()은 다음 과 같이 구성됩니다 .

'/polls/5/results/'

기본 서식 파일보기 바인딩 코드에서 우리는 사용 HttpResponse()또는 render()그들은 일반적으로 덜 추상화 포함과 같이 하나 개의 뷰 기능이 하나의 템플릿을 반환를 :

def index(request):
    return render(request, 'polls/index.html') 

그러나 많은 합법적 인 리디렉션 사례에서 일반적으로 매개 변수 목록에서 URL을 구성합니다. 여기에는 다음과 같은 경우가 포함됩니다.

  • POST요청을 통한 HTML 양식 제출
  • 사용자 로그인 사후 검증
  • JSON 웹 토큰을 통해 비밀번호 재설정

이들 중 대부분은 일부 형태의 리디렉션과 일련의 매개 변수를 통해 구성된 URL을 포함합니다. 이것이 이미 유용한 답변 스레드에 추가되기를 바랍니다.


4

이 기능은 건식 원칙을 지원하므로 앱 전체에서 URL을 하드 코딩하지 않습니다. URL은 한 곳에서 정의해야하며 한 곳만 URL conf입니다. 그 후에는 해당 정보를 참조하는 것입니다.

reverse()보기 경로 또는 url conf의 page_name 매개 변수가 지정된 페이지의 URL을 제공하는 데 사용하십시오 . 를 사용하여 템플릿에서 사용하기에 적합하지 않은 경우에 사용합니다 {% url 'my-page' %}.

이 기능을 사용할 수있는 곳이 많이 있습니다. 내가 찾은 한 곳은 사용자를 뷰에서 리디렉션 할 때입니다 (종종 양식을 성공적으로 처리 한 후)-

return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

템플릿 태그를 작성할 때도 사용할 수 있습니다.

내가 사용한 또 다른 시간 reverse()은 모델 상속이었습니다. 부모 모델에 ListView가 있었지만 그 부모 개체 중 하나에서 연결된 자식 개체의 DetailView로 가져 가고 싶었습니다. get__child_url()자식의 존재를 식별 하는 함수를 부모에 첨부 하고을 사용하여 DetailView의 URL을 반환했습니다 reverse().



2

기존 답변은 매우 명확합니다. 이유를 모르는 경우를 대비 reverse하여 : URL 이름을 입력하고 실제 URL을 제공합니다.


1
튜토리얼 (Django Girls)에서 Django를 배우기 만하면됩니다. 가파른 학습 곡선입니다. 나는이 함수의 이름이 두려운 것이라고 생각한다. 어떤 자격도없이 "reserve"는 목록이나 문자열을 예약 할 것을 강력히 제안한다.
마이크 설치류

@ mikerodent 나는 당신에게 완전히 동의합니다. 게다가,이 답변들 중 어느 것도 함수가 역으로 불리는 설명하지 않습니다 . 그것은 나쁜 이름 imo입니다.
Soham Dongargaonkar

1

reverse ()는 장고 드라이 원칙을 준수하는 데 사용됩니다. 즉, 나중에 URL을 변경하면 reverse (urlname)을 사용하여 해당 URL을 참조 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.