2009-11-05 6 views
1

나는 Cake 배경에서 왔습니다. 이제 방금 장고를 배우기 시작했습니다. 나는 그것을 아주 좋아하지만, 케이크와 같은 컨벤션에 비해 컨벤션을 사용하기를 바랍니다. 따라서장고에 더 많은 CoC 추가하기

  1. 어떻게 케이크 스타일 URL을 자동으로 가져올 수 있습니까? 예를 들어, 내가 mysite.com/posts/view/5에 갔다면 mysite.posts.views.view을로드하고 그것에 5이라는 인수를 전달할 것입니까? 나는 urls.py에 (r'^(.*)/(.*)', 'mysite.$1.$2'),과 같은 것을 추가 할 수 있다고 생각하고 있었다. 그러나 물론 작동하지 않을 것이다.

  2. 어떻게 템플릿을 자동으로로드 할 수 있습니까? 각 뷰 함수는 templates/posts/view.html과 같은 템플릿을 자동으로로드해야합니다.

이렇게해도 될까요, 아니면 장고의 핵심을 해킹해야합니까?


여기에 무엇을 제안 Carl에 따라 내 솔루션입니다 :

urlpatterns = patterns('', 
    # url pats here 
    url(r'^(?P<app>\w+)/(?P<view>\w+)/(?P<args>.*)$', 'urls.dispatch') 
) 

def dispatch(req, app, view, args): # FIXME: ignores decorators on view func! 
    func = get_callable(app+'.views.'+view) 
    if args: 
     ret = func(req, *args.split('/')) 
    else: 
     ret = func(req) 
    if type(ret) is dict: 
     return render_to_response(app+'/'+view+'.html', ret) 
    else: 
     return ret 

초기 테스트를 꽤 잘 작동하는 것 같다. 단일 기능으로 두 가지 문제를 해결합니다. 아마도 GET 스타일의 인수를 지원하지 않을 것입니다.

답변

4

이러한 점은 모두 Django 코어를 해킹하지 않고 구현할 수 있지만 고급 Python 기술에 익숙하지 않은 수준이 필요합니다.

당신은이 같은 패턴으로 일반 URL 패턴을 수행 할 수 있습니다

url(r'^(?P<appname>\w+)/(?P<viewfunc>\w+)/(?P<args>.*)$', 'myresolverfunc') 

는 그런 다음 'myresolverfunc' 'APPNAME을 "소요"보기 "기능"viewfunc "및"인수 "매개 변수를 정의, args를 "/"로 분할하고 참조 된 뷰 기능으로 동적으로 가져오고 디스패치하는 원하는 로직을 구현할 수 있습니다. 가장 까다로운 부분은 동적 가져 오기입니다. Django 소스에서 "importlib"을 검색하여 동적 가져 오기가 내부적으로 다양한 위치에서 수행되는 방식을 확인할 수 있습니다.

자동 템플릿 로더는 다양한 "render_to" decorators과 비슷한 뷰 기능 데코레이터로 구현 될 수 있습니다. 단, 데코레이터에 전달하는 대신 템플리트 이름을 생성한다는 점이 다릅니다. 함수 객체를 인트로 스펙 션하여 이름을 가져와야합니다. 앱 이름을 가져 오는 것은 더 까다 롭습니다. 각 뷰에서 모듈 수준의 전역 코드로 하드 ​​코딩해야 할 것입니다.py 파일을 만들거나 위 URL 디스패처와 함께 작업하고 요청 객체에 앱 이름이나 일부 주석을달라고 요청하십시오.

+0

디렉토리 이름을 가져올 수 있습니까? 데코레이터를 사용해야한다는 것은 다소 불행한 일입니다. 내가 누를 수있는 "후크"가 없습니까? Cake는 필터를 사용하기 전이나 후에 사용할 수 있습니다. 아니면 기본 컨트롤러를 덮어 쓸 수 있습니다 ... – mpen

+0

그래, __file__과 os.path.dirname을 사용하여 디렉토리 이름을 얻을 수는 있지만 그보다 못 생기거나 더 부서지기 쉽습니다. 내가 준 옵션 중 하나. 그리고 데코레이터에 대해 불행한 점은 무엇입니까? 파이썬을 사용할 수있을 때 장고에 마법의 고리를 제공 할 이유는 없습니다. –

+0

각 기능에 뭔가를 추가해야하므로 쉽게 잊어 버릴 수있어 불행합니다. 나는 모든 뷰 기능에 자동으로 적용될 수있는 것을 원했다. – mpen

1

나는 장고의 핵을 해킹 할 필요가 없다. 너 generic views이 필요할 것 같은데. Generic Views topic guide도 확인하십시오.

예 :

주어진 다음의 URL 패턴

urlpatterns = patterns('django.views.generic.simple', 
    (r'^foo/$',    'direct_to_template', {'template':'foo_index.html'}), 
    (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template':'foo_detail.html'}), 
) 

... 요청

일반 뷰 설명서에 주어진 첫 번째 예는 첫 번째 글 머리처럼 들린다 to/foo /는 템플릿 foo_index.html을 렌더링하고/foo/15 /에 대한 요청은 foo_detail.html을 15로 설정된 컨텍스트 변수 {{params.id}}로 렌더링합니다.

+0

음 ....이 문제를 어떻게 다룰 수 있을지 잘 모르겠습니다. 각 URL에 대해 별도의 URL 패턴을 정의했습니다. 나는 그것을 자동으로하고 싶다. – mpen

+0

마크, 나는 그 질문을 오해했다. 나는 당신이 당신의 앱에 맵핑하고, 매개 변수를 전달하고, 전달할 단일 패턴을 의미한다고 생각하지 않았습니다. 나는 우리가 하나의 앱에 대해 이야기했을지도 모른다고 생각했다. –

관련 문제