{% URL 사용 ??? 장고 템플릿의 %}


84

나는 google에서 템플릿에서 'url'태그를 사용하는 방법에 대한 답변을 많이 보았고 '템플릿에 삽입하고 URL을 원하는보기를 가리킬뿐'이라는 많은 응답을 찾았습니다. 나에게는 기쁨이 없습니다 :( 나는 가능한 모든 순열을 시도했으며 마지막 수단으로 여기에 게시하는 데 의지했습니다.

여기 있습니다. 내 urls.py는 다음과 같습니다.

from django.conf.urls.defaults import *
from login.views import *
from mainapp.views import *
import settings

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^weclaim/', include('weclaim.foo.urls')),
    (r'^login/', login_view),
    (r'^logout/', logout_view),
    ('^$', main_view),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
    #(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': '/home/arthur/Software/django/weclaim/templates/static'}),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
)

내 'login'디렉토리의 'views.py'는 다음과 같습니다.

from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib import auth

def login_view(request):
    if request.method == 'POST':
        uname = request.POST.get('username', '')
        psword = request.POST.get('password', '')
        user = auth.authenticate(username=uname, password=psword)
        # if the user logs in and is active
        if user is not None and user.is_active:
            auth.login(request, user)
            return render_to_response('main/main.html', {}, context_instance=RequestContext(request))
            #return redirect(main_view)
        else:
            return render_to_response('loginpage.html', {'box_width': '402', 'login_failed': '1',}, context_instance=RequestContext(request))
    else:
        return render_to_response('loginpage.html', {'box_width': '400',}, context_instance=RequestContext(request))

def logout_view(request):
    auth.logout(request)
    return render_to_response('loginpage.html', {'box_width': '402', 'logged_out': '1',}, context_instance=RequestContext(request))

마지막으로 login_view가 가리키는 main.html은 다음과 같습니다.

<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>

그렇다면 왜 매번 'NoReverseMatch'가 발생합니까?

* (약간 다른 메모에서 모든 render-to-response 끝에 'context_instance = RequestContext (request)'를 사용해야했습니다. 그렇지 않으면 템플릿에서 {{MEDIA_URL}}을 인식하지 못해 참조 할 수 없기 때문입니다. 모든 css 또는 js 파일. 왜 그런지 잘 모르겠습니다. 나에게 옳지 않은 것 같습니다.) *


1
에 대해 말하는 내용 context_instance=RequestContext(request)이 정확합니다. 이는 모든 템플릿에 제공된 컨텍스트 변수에 대한 템플릿 액세스를 허용하는 데 필요합니다. 이것은 기본적으로 모든 일반보기에 대해 수행되지만 사용자 정의보기에서 직접 수행해야합니다.
Marcus Whybrow 2011 년

사이트 전체의 일관성을 유지하기 위해 템플릿에서 항상 CSS 및 js 파일에 액세스 할 것이기 때문에 나에게 조금 이상하게 보입니다. 따라서 기본적으로 {{MEDIA_URL}}에 액세스 할 수 없습니까?
Robert Johnstone 2011 년

1
여기 허용 대답은 더 이상 유효하지 않습니다
단 게일

새 답변을 추가하면 동의합니다
Robert Johnstone

답변:


55

logout_view함수 를 가져 오는 대신 urls.py파일에 문자열을 제공해야 합니다.

그래서 아닙니다 (r'^login/', login_view),

그러나 (r'^login/', 'login.views.login_view'),

그것이 일을하는 표준 방법입니다. 그런 다음 다음을 사용하여 템플릿의 URL에 액세스 할 수 있습니다.

{% url login.views.login_view %}

2
예, 확실히 문자열을 사용하십시오. 이런 식으로 접두사를 사용할 수도 있으며 모든 뷰 함수를 URLConf로 가져올 필요가 없습니다.
Sri Raghavan 2011 년

나는 이것을 시도했고 'Caught NoReverseMatch while rendering : Reverse for'login.views.login_views 'with arguments'() 'and keyword arguments'{} 'not found.' 다시 :(
Robert Johnstone

기다려 ... 스크래치! 나는 15 분을 기다렸다가 다시 시도했고 효과가 있었다 (yippeeee !!!). 좋아요 1. 다음 질문입니다. 관리 페이지에 추가 한 사이트가 하나 뿐인 경우 어떻게 {% url ??? %}
Robert Johnstone 2011 년

네, 이것은 necro이지만, URL 태그는 2015 년에도 여전히 저를 물고 있습니다. 구문을 계속 변경하지 않으면 도움이 될 것입니다.
Dave

6
내가 Google에서 왔기 때문에 django 1.8+의 경우 뷰 인수로 문자열을 전달하는 것은 더 이상 사용되지 않으며 곧 제거 될 것이라고 말해야합니다. 이 게시물과 같이 실제로 콜 러블을 전달해야합니다.
user3599803

104

선택한 답변이 오래되어 다른 사람이 나를 위해 일하지 않았습니다 (Django 1.6 및 [거의] 등록 된 네임 스페이스가 없습니다.)

Django 1.5 이상의 경우 ( 문서에서 )

경고 함수 경로 또는 패턴 이름을 따옴표로 묶는 것을 잊지 마십시오!

명명 된 URL로 다음을 수행 할 수 있습니다.

(r'^login/', login_view, name='login'),
...
<a href="{% url 'login' %}">logout</a>

보기가 다른 매개 변수를 사용하는 것처럼 쉽습니다.

def login(request, extra_param):
...
<a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a>

1
그래 알아. {% load url from future %}현재 1.4에서 사용 하고 있습니다. 좋은 자리
Robert Johnstone

5
이것은 답으로 선택되어야합니다. 역 일치 URL에 문자열 사용은 최신 django 버전에서 더 이상 사용되지 않습니다.
Sumudu

44

URL 이름을 따옴표로 묶었는지 확인하고 (django 1.5 이상) URL에 매개 변수가 있으면 따옴표 밖에 있어야 합니다 (이 실수를 알아내는 데 몇 시간을 보냈습니다!).

{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %}
<a href="{{ the_url }}"> link_name </a>

나는 이것이 오래된 대답이라는 것을 알고 있지만 이것은 정말로 도움이되었습니다. Django 1.6의 포크 인 django-norel을 사용하고 있는데, 따옴표로 URL 이름을 캡슐화하면 TypeError가 수정 되었기 때문에이 문제를 겪어야합니다.
robobrobro 2015-06-26

2
올바른 문서를 사용하면 구문이 계속 변경되기 때문에 도움이됩니다. {% url app_views.client client.id %}1.4에서는 {% url 'app_views.client' client.id %}(따옴표 없음), 1.5 -1.7에서는 {% url 'app-views-client' client.id %}( 따옴표 포함) , 1.8에서는 (밑줄이나 점없이 대시 만).
Dave

오 주님과 저는 곧 1.8로 업그레이드 할 계획이었습니다.
Bogatyr 2015 년

17

url템플릿 태그 문자열뿐만 아니라 기능에 참조로서 매개 변수를 전달한다 reverse(). 이 작업을 수행하는 가장 간단한 방법 name은보기에를 추가하는 것입니다.

url(r'^/logout/' , logout_view, name='logout_view')

나는 그것을 시도했지만 '유효하지 않은 구문 (urls.py, 14 행)':(
Robert Johnstone

이것에 대해 정말 이상한 점은 (PyCharm-멋진 앱)이 라이브러리 가져 오기 (libxml2mod.name 또는 unicodedata.name 또는 twisted.trial.runner)를 권장하지 않고 위와 같이> name = 'logout_view'<를 사용하도록 허용하지 않는다는 것입니다. 이름)
Robert Johnstone 2011 년

함수는 어디에 reverse()정의되어 있습니까?
CodyBugstein

{% url 'logout_view'%}를 사용하는 템플릿에서 django.readthedocs.org/en/latest/intro/tutorial03.html
Juan Rojas

12

나는 같은 문제에 봉착했다.

문서에서 찾은 것은 네임 스페이스를 사용해야합니다.

당신의 경우 {% url login:login_view %}


요즘에는 훨씬 더 많이 네임 스페이스를 사용합니다. 만든다 더 읽기와 당신에게 실제로 평균 뭔가 URL
로버트 존스톤

문서 링크를 포함 해 주시겠습니까?
geoidesic

1

당신의 모범으로 판단 {% url myproject.login.views.login_view %}하면 이야기의 끝 이 아니어야 합니까? ( myproject실제 프로젝트 이름으로 대체 )


위의 'Caught NoReverseMatch while rendering : Reverse for'weclaim.login.views.login_views 'with arguments'() 'and keyword arguments'{} 'not found.' (나는 내 프로젝트의 이름은 내 모든 코드에 저장되어있는 루트 디렉토리와 같은 이름이라고 추정하고 있습니다)
로버트 존스톤
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.