2014-10-15 5 views
2

하나의 mako 템플릿에 따라 여러 뷰가있는 피라미드 애플리케이션이 있습니다. 뷰는 매우 복잡하고 버그가 없으므로 뷰를 확장하거나 병합하지 않고 해당 템플릿을 병합하거나 병합하고 싶지 않습니다.여러 파일에서 들어오는 마코

그러나 한 가지보기로 다른 모든 것을 표현하고 싶습니다. 모든 피라미드 뷰와 템플릿을 병합하는 것은 사실상 옵션이 아닙니다.

예를 들어, 로그인보기 & 템플릿과 가입보기 & 템플릿이 있습니다. 이제는 루트 페이지에 둘 다 포함시키고 싶습니다. 로그인과 가입은 공통 스크립트와 스타일 시트 가져 오기가 포함 된 base.mak에서 상속합니다. 다음은 내가 원하는 마코 수입 구조를 그림으로 표현한 것입니다.

 base.mak 
    /  \ 
login.mak   signup.mak 
     \  / 
     root.mak 

또한, 나는 그런 그들을 체인 시도 : 베이스 -> 로그인 -> 회원 가입 -> 루트

그러나, 나는보기가 더 이상 각각의 템플릿 이야기 없다고 생각합니다.

내 사슬 (login.mak -> signup)을 할 때 내 문제가 발생합니다. 필자는 전체 코드가 약간 길기 때문에 유사 코드를 추출하고 아래 코드를 추출 할 것입니다 (더 많은 코드가 필요할 경우 자유롭게 외치십시오).

base.mak :

<!DOCTYPE HTML> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title> 
      ${next.title()} 
     </title> 
     #Imports 

     ${next.head()} 

    </head> 
    <body> 
     <div id = "content"> 
      ${next.body()} 
     </div> 
    </body> 
</html> 

login.mak :

<%inherit file="base.mak"/> 

<%def name="title()"> 
    ${next.title()} 
</%def> 

<%def name="head()"> 
    ${next.head()} 
</%def> 

<div id="login"> 
    <div id="message"> 
     ${sMessage} 
    </div> 

    <div id="form"> 
     <form action="${url}" method="post">  <--- url returned in views.py 
... 
</div> 

${next.body()} 

signup.mak :

이제
<%inherit file="login.mak"/> 

<%def name="title()"> 
</%def> 

<%def name="head()"> 
</%def> 

<div id="box"> 
... 
</div> 

내 문제 여기에서 상속하려고 할 때 내보기에서 반환 된 내 URL은 정의되지 않습니다.

물론이 작업을 수행하는 경우 base.mak를 추가하여 가입에서 상속하는 것이 중요합니다.

나는이 간단한 수정이 있다고 가정하지만 필자는 피라미드에서 템플릿을 실제로 수행하는 방법에 대한 예제/설명을 찾을 수 없습니다.

또는 여러 개의 피라미드보기 및 템플릿을 단일보기로 결합하는 다른 방법이 있습니까?

답변

0

좋아, 알아 냈어. 하나는 mako의 <%include/>을 사용해야하며 복잡한 상속 구조가 없습니다. 그래서, 지금 내 파일은 다음과 같이 :

root.mak

<%inherit file="base.mak"/> 

<%def name="title()"> 
    Welcome 
</%def> 

<%def name="head()"> 
</%def> 


<%include file="login.mak"/> 
<%include file="signup.mak"/> 

login.mak :

<%inherit file="base.mak"/> 
<%def name="title()"> 
</%def> 

<%def name="head()"> 
    <link rel="stylesheet" type="text/css" href="${request.static_url(... 
</%def> 

<div id="login"> 
    <div id="..... 
</div> 

와 signup.mak와 동일한 구조. base.mak는 여전히 위의 질문과 같습니다.

피라미드를 사용하는 경우 (예를 들어 다른 프레임 워크가 동일하게 작동한다고 가정 할 때) 양식에서 정보를 받아서 전달하는보기가있는 경우 (예 : @view_config(renderer='path/file.mak') 제외) 해당 기능을 부모보기 기능에, 내 경우에 root. 다른 말로하면 :

@view_config(renderer='pyramidapp:templates/root.mak', 
    context=Root, 
    name="") 
@forbidden_view_config(renderer='pyramidapp:templates/root.mak') 
def root(self): 
    xLoginRet = login(self) 
    xSignupRet = signup(self) 
    #logic and functionality for both, return stuff to go to base.mak