가끔 장고 코드를 읽을 때 일부 템플릿에서 볼 수 reverse()
있습니다. 이것이 무엇인지 잘 모르겠지만 HttpResponseRedirect와 함께 사용됩니다. 언제 어떻게 reverse()
사용해야합니까?
누군가가 몇 가지 예를 들어 대답하면 좋을 것입니다 ...
가끔 장고 코드를 읽을 때 일부 템플릿에서 볼 수 reverse()
있습니다. 이것이 무엇인지 잘 모르겠지만 HttpResponseRedirect와 함께 사용됩니다. 언제 어떻게 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
.
{{ url 'url_name' }}
이어야합니다 {% url url_name %}
. 이것은 다음 Django 릴리스 (1.5)에서 변경 될 예정 {% url 'url_name' %}
입니다. 에 대한 문서 의 URL templatetag 주고 좋은 정보는 당신이 "상위 호환성"부분을 약간 아래로 스크롤하면
url_reverse
. 이러한 종류의 이상한 문제를 처리하는 가장 좋은 방법은 사용을 거부하는 것입니다.
이것은 오래된 질문이지만 여기에 누군가를 도울 수있는 것이 있습니다.
공식 문서에서 :
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,)))
기존의 대답은 설명에서 훌륭한 일을 한 어떤 이의 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 양식 제출이들 중 대부분은 일부 형태의 리디렉션과 일련의 매개 변수를 통해 구성된 URL을 포함합니다. 이것이 이미 유용한 답변 스레드에 추가되기를 바랍니다.
이 기능은 건식 원칙을 지원하므로 앱 전체에서 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()
.
그에 대한 문서가 있습니다
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
주어진보기에 대한 URL을 생성하는 데 사용할 수 있습니다
주요 장점은 코드에 하드 라우트를 작성하지 않는다는 것입니다.
기존 답변은 매우 명확합니다. 이유를 모르는 경우를 대비 reverse
하여 : URL 이름을 입력하고 실제 URL을 제공합니다.
url--> view name
. 그러나 때로는 리디렉션 할 때와 같이 역방향으로 이동하여 Django에보기 이름을 지정해야하며 Django는 적절한 URL을 생성합니다. 즉,view name --> url
. 즉,reverse()
(url 함수의 반대입니다). 전화를하는generateUrlFromViewName
것이 더 투명 해 보일 수도 있지만 너무 길고 일반적이지 않을 수도 있습니다. docs.djangoproject.com/en/dev/topics/http/urls/…