2011-07-01 5 views
6

제품에 대한 사용 가능한 정보에 따라 표시하려는 3 가지 제품 페이지 레이아웃이 있습니다. 탐색을 사용하여 모든 정보를 가져 오는 ProductFinder 클래스가 있습니다. 예를 들어 사용자가 domain/green/small으로 이동하면 ProductFinder은 내 DB에서 녹색이고 작은 모든 제품을 나열합니다. 이 목록은 ProductFinder 클래스의 self.products입니다. products.py에서피라미드에서 컨텍스트의 내용을 기반으로 다른 렌더러를 사용하려면 어떻게해야합니까?

config.add_view('app.views.products', name='') 

내가 가진 :

from pyramid.view import view_config 
@view_config(context='app.models.ProductFinder', renderer='productpage.mako') 
def products(context, request): 
    return dict(page=context) 

내가 다른 마코을 렌더링하고 싶습니다하지만 context.products에서 무엇을 바탕으로 내 __init__.py에서 나는 라인을 추가했습니다.

def products(context, request): 
    if len(context.products) == 1: 
     return render("oneproduct.mako") 
    elif len(context.product) == 2: 
     return render("twoproducts.mako") 

그래서 어떻게 내 문맥의 내용에 따라 다른 서식 파일을 렌더링 할 수 있습니다 철탑에서 나는 무언가 같이했을 것?

+0

첫 번째 라인은 "config.add_view ('app.views.products', name = '')"는 아마도 당신이 원하는 것이 아닙니다. @view_config는 내가 여기서 정말로 생각하는 유일한 것입니다. –

답변

10

나는이 종류가 당신이 당신의 템플렛에서 돌보고 싶은 무언가 같이 말하는 것에 의하여 시작할 것이다.

그러나 어떤 방식 으로든 어떤 조회자가 뷰 렌더의 일부로 사용되는 렌더러에 영향을 줄 수 있습니다. 여러 뷰에 대해 동일한 뷰 핸들러를 사용할 수 있다는 것을 이미 알고 있기 때문에 피라미드가 어느 뷰를 사용할 지 파악하는 데 도움이됩니다. 예를 들어

:

from pyramid.view import view_config 

def ProductLengthPredicate(length): 
    def check_length(context, request): 
     return len(context.products) == length 
    return check_length 

@view_config(context='app.models.ProductFinder', renderer='oneproduct.mako', 
      custom_predicates=(ProductLengthPredicate(1),)) 
@view_config(context='app.models.ProductFinder', renderer='twoproducts.mako', 
      custom_predicates=(ProductLengthPredicate(2),)) 
@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako') 
def products(context, request): 
    return dict(page=context) 

NB. 어떤 사람들은 접근에 더 많은 관심을 가질 것입니다. 왜냐하면 그들은 custom_predicates에 의존하지 않을 것이기 때문입니다. 그러나 물론 그것은 당신에게 달렸습니다! 보기가 render_to_response이 바로 이러한 작업을 수행하는 것입니다 이는 Response()을 반환하는 경우 피라미드 렌더러를 무시하기 때문에

@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako') 
def products(context, request) 
    opts = dict(page=context) 
    if len(context.products) == 1: 
     return render_to_response('oneproduct.mako', opts, request) 
    if len(context.products) == 2: 
     return render_to_response('twoproducts.mako', opts, request) 
    return opts 

이 작동합니다.

+0

대단히 감사합니다. 커스텀 술어는 내가 찾고 있었던 것과 정확히 일치했다. – jchysk

3

나는 좋은 방법인지 확실하지 않지만 아마도 request.override_renderer = 'oneproduct.mako'을 사용할 수 있습니다.

수량에 따라 제품을 표시하는 방금 다른 방식 일 경우 템플릿에서 결정해야합니다.

+0

좋은 간단한 해결책! – Lee