2010-01-08 3 views
8

재사용 가능한 앱을 쓰고 있습니다. 그리고 여러 번 배포하고 싶습니다.다중 전개 가능한 재사용 가능한 Django 응용 프로그램에서 역방향으로 사용하기 위해 current_app을 얻는 방법은 무엇입니까?

urlpatterns = patterns('', 
(r'^carphotos/', include('webui.photos.urls', app_name='car-photos')), 
(r'^userphotos/', include('webui.photos.urls', app_name='profile-photos')),) 

사진/urls.py : 나는 새 앨범 album_page를 만들기위한 URL을 표시 할 album_list보기에

urlpatterns = patterns('webui.photos.views', 
url(r'^$', album_list, name="album-list") 
url(r'^newalbum/$', album_page, {'create': True}, name="album-create"),) 

여기

는 urls.py입니다.

올바른 URL을 얻으려면 역순 함수의 매개 변수 current_app를 사용해야한다는 것을 알게되었습니다.

하지만이 current_app을 얻는 방법은 무엇입니까? 대답은 간단하다고 생각했습니다. 하지만 장고 설명서에서 찾을 수 없습니다.

감사합니다, 닉

답변

-3

며칠 동안이 주제를 살펴본 후 장고 앱을 두 번 이상 탑재하는 것이 자연스럽지 않다는 것을 알게되었습니다.

플러그 가능 응용 프로그램 패턴의 구현이 있습니다 : http://github.com/nowells/django-pluggables. 너무 힘들어 보입니다.

그래서 반복 된 기능을 맞춤 태그로 이동하고 내 앱을 사용할 때마다 템플릿을 복제하기로 결정했습니다. 사용자 정의 태그를 사용하고 기능을 확장하여 DRY 원칙을 따르는 데 도움이되기를 바랍니다.

-4

나는 그게 sites 프레임 워크가 무엇인지 믿습니다.

+0

난 당신이 제안 문서를 참조하십시오. 나는 그것이 옳은 대답이라고 생각하지 않는다. 문서에 따르면 Sites 프레임 워크는 사이트간에 정보를 공유하고자 할 때 유용하지만, 제 경우에는 하나의 사이트 만 있습니다. 기술적으로 다른 하위 도메인에 내 사진 앱을 배포하는 것이 가능하지만 재사용 가능한 앱의 모든 인스턴스에 대해 별도의 도메인을 만드는 것이 좋지 않다고 생각합니다. – Nike

1

동일한 앱이라도 URL에 다른 app_name이 있습니다. app_name을 동일한 것으로 설정하고 namespace을 각 인스턴스에 대해 고유하게 설정하십시오. 예.

urlpatterns = patterns('', 
(r'^carphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='car-photos')), 
(r'^userphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='profile-photos')),) 

그런 다음 reverse를 사용할 때는 current_app 인수를 제공하십시오. 참조 http://docs.djangoproject.com/en/dev/topics/http/urls/#reversehttp://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

[편집] 귀하의 질문에 다시 읽은 후 : 당신이 {% url %} 태그를 사용하는 경우가 current_app 인수를 제공 할 필요가 없습니다

합니다. 내가 믿기 만하면 일치하는 URL을 기반으로 자동으로 설정되는 current_app이라는 템플릿 변수에 자동으로 액세스합니다.

+0

이 코드를 시도했지만 문제가 해결되지 않았습니다. 내가 발견 한 것처럼 current_app는 명시 적으로 제공해야하는 Context 또는 RequestContext의 인수입니다. 그리고 그것을 얻는 방법은이 페이지의 질문입니다. BTW는 네임 스페이스 인수를 설정 한 후 http://code.djangoproject.com/ticket/11559에 설명 된대로 URL이 손상됩니다. – Nike

10

난이 꽤 오래된 질문 알고 ...하지만 나는 해결책을 찾을 생각 : 윌 하디 당신이 그것을 전혀 정의 두 인스턴스에 대한 app_name에게 동일하게 유지 (또는하지해야합니다 제안으로

을 , 포함 된 URL이있는 앱으로 기본 설정됩니다). 하지만 각 응용 프로그램 인스턴스에 대한 별도의 네임 스페이스를 정의

urlpatterns = patterns('', 
    (r'^carphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='car-photos')), 
    (r'^userphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='profile-photos')), 
) 

는 이제 뷰에서 현재 활성화 된 응용 프로그램 인스턴스 (네임 스페이스)를 설정하는 약간 까다로운 부분 온다. 어떤 앱 인스턴스가 활성 상태인지 찾아서 RequestContext에 전달해야한다는 의미입니다.

는 현재 활성화 된 응용 프로그램을 찾으려면

django.core.urlresolvers.resolve을 사용할 수 있습니다

r = resolve(request.path) 
r.app_name # the app name 
r.namespace # the the currently active instance 

그래서 그에 따라 귀하의 의견을 (이 클래스를 기반으로보기를 사용하여 가정)를 업데이트해야합니다 :

from django.core.urlresolvers import resolve 
from django.views.generic import TemplateView 


class AlbumCreateView(TemplateView): 
    template_name = 'path/to/my/template.html' 

    def render_to_response(self, context, **response_kwargs): 
     response_kwargs['current_app'] = resolve(self.request.path).namespace 
     return super(AlbumPageView, self).render_to_response(context, **response_kwargs) 

이제 url 태그는 자동으로 올바른 네임 스페이스로 되돌려지고 필요한 경우 특정 앱 네임 스페이스로 되돌릴 수 있습니다.

{% url webui_photos:album-create %} {# returns the url for whatever app is current #} 
{% url car-photos:album-create %} 
{% url profile-photos:album-create %} 

이보기의 URL을 바꾸려면, 현재 응용 프로그램 인스턴스는 수동으로 전달해야합니다 :

reverse('webui_photos:album-create', current_app=resolve(self.request.path).namespace)) 
관련 문제