2012-11-29 2 views
1

URL을 찾고 템플릿에 전달하기 위해 reverse (name, args)를 사용하는 많은 클래스 기반보기가 있습니다. 그러나 문제는 클래스 패턴을 기반으로하는 뷰를 인스턴스화해야 urlpattern을 정의 할 수 있다는 것입니다. 즉, urlpatterns가 비어있는 동안 클래스가 인스턴스화되어 역방향 오류가 발생합니다. 나는이 템플릿을 lambda : reverse (name, args)에 전달함으로써이 문제를 해결해 왔지만 확실한 해결책이있다. 다음의 간단한 예로서Django 클래스보기 및 역방향 URL

예외와 함께 실패 가

mysite.urls에

from mysite.views import MyClassView 

urlpatterns = patterns('', 
    url(r'^$' MyClassView.as_view(), name='home') 
) 

views.py 어떤 패턴이없는 mysite.urls urlconf 포함 XXXX 에서 ImproperlyConfigured

class MyClassView(View): 
    def get(self, request): 
     home_url = reverse('home') 
     return render_to_response('home.html', {'home_url':home_url}, context_instance=RequestContext(request)) 

home.html을

<p><a href={{ home_url }}>Home</a></p> 
나는 현재

class MyClassView(View): 
    def get(self, request): 
     home_url = lambda: reverse('home') 
     return render_to_response('home.html', {'home_url':home_url}, context_instance=RequestContext(request)) 

에 views.py 변경하여 템플릿 렌더링을 실행하는 역 강제로 문제를 해결하고 있어요

그것은 작동하지만이 정말 못생긴 확실히 더 나은 방법이있다 . 그래서 클래스 기반 뷰에서 반대를 사용하지만 역 요구 urlpatterns을 필요로보기를 요구 urlpatterns의 순환 의존성을 피할 수있는 방법이 ...이

편집 : 나는 그래서 이것을 사용하고

:

views.py 기본적으로 몇 가지 다른 콘텐츠 유형에 동일한 사이드 바 템플릿을 사용하고 싶습니다. views21 사이드 바에 표시되는 모델은 임의이지만 형식은 항상 동일합니다.

답변

2

, 그것은 사용 괜찮은지 reverse

class MyClassView(View): 
    def get(self, request): 
     home_url = reverse_lazy('home') 
     return render_to_response('home.html', {'home_url': home_url}, 

reverse 방법은 클래스를 정의 할 때 호출되지 않습니다 - 요청이 처리 될 때 그것은 단지라고하며 get 메소드가 호출 될 때, 그래서 오류가 있어서는 안됩니다. 위의 예제를 테스트 한 결과 제대로 작동합니다.

그러나 sidebar_activeusers 데코레이터를 사용하면 reverse 호출이 URL conf가로드되기 전에 발생합니다.이러한 경우에는 reverse_lazy을 사용할 수 있습니다. 의 URL의 conf가 아직로드되지 않았기 때문에

from django.core.urlresolvers import reverse_lazy 

class MyOtherClassView(View): 
    home_url = reverse_lazy('home') 

    def get(self, request): 
     return render_to_response('home.html', {'home_url':self.home_url}, context_instance=RequestContext(request)) 

이 시간, home_url이 클래스를 정의 할 때 설정되어 있으므로 reverse_lazy 대신 역의 필요, 다음은 행동 reverse_lazy의 예입니다.

+0

정확히 내가 뭘 찾고 있었는지, 고마워! – kalhartt

2

{% url 'home' %}을 사용하여 home URL에 템플릿에서 직접 액세스 할 수 있습니다. urls.py 파일에서 이름이 지정된 URL에 액세스하는 표준 방법입니다.

클래스 기반보기 기능에서 home_url 변수를 템플릿에 명시 적으로 보낼 필요가 없습니다. 당신의 home.html 파일 즉

: -

<p><a href="{% url 'home' %}">Home</a></p> 

할 것입니다. 귀하의 예를 MyClassView를 들어

+0

위의 내용은 사용법을 보여주는 간단한 예입니다. 나는 이것을 사용하지 못하는 이유를 보여주기 위해 더 나은 예제로 내 포스트를 업데이트 할 것이다. – kalhartt