태그 보관물: django

django

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

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

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



답변

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.


답변

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

공식 문서에서 :

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 양식 제출
  • 사용자 로그인 사후 검증
  • JSON 웹 토큰을 통해 비밀번호 재설정

이들 중 대부분은 일부 형태의 리디렉션과 일련의 매개 변수를 통해 구성된 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을 제공합니다.


답변

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