2013-06-27 103 views
4

我們有這個代碼,它工作正常。重構後,它不再工作。就像評論所說,如果請求不是ajax請求,我們只想從基本頁​​面繼承。爲此,我們將參數傳遞給模板,並根據參數繼承或不繼承。Mako動態模板繼承

View.py

class Router(object): 
    def __init__(self, request): 
     self.request = request 

    @view_config(route_name="home") 
    def get(self): 
     template = "home.mak" 
     value = {'isPage':self.request.is_xhr is False} 
     return render_to_response(template, value, request=self.request) 

Template.mak

##conditional to determine with the template should inherit from the base page 
##it shouldn't inherit from the base page is it is being inserted into the page using ajax 
<%! 

    def inherit(context): 
     if context.get('isPage') == True: 
      return "base.mak" 
     else: 
      return None 
%> 
<%inherit file="${inherit(context)}"/> 

目前,錯誤的是未定義沒有屬性__ 的GetItem __。如果我們將$ {inherit(context)}更改爲$ {inherit(value)},那麼我們得到的全局變量值是未定義的。

+1

你可以嘗試把所有的邏輯到inherit標籤?只是將函數調用從等式中刪除:$ {'base.mak'if context.get('isPage')else None} –

+0

我不認爲這是問題所在。我們做了相當大的重構,上面的代碼再次運行。我猜傳入的上下文沒有初始化,或者其中一個模板出現語法錯誤。 – JeffRegan

+0

另外,請求對象有一個名爲is_xhr的屬性,如果請求是異步的,則該屬性爲true。我們使用這個屬性來確定我們是否需要加載整個頁面。所以is_page = self.request.is_xhr是False – JeffRegan

回答

1

剛剛遇到同樣的問題,相同的用例以及實際(渲染布局或不取決於請求是一個XHR)。

可以明顯訪問request通過context,這樣就可以避免不得不在兩個地方(視圖和模板)邏輯的這一點點分裂:

<%! 
    def inherit(context): 
     if not context.get('request').is_xhr: 
      return 'layout_reports.mako' 
     else: 
      return None 
%> 
<%inherit file="${inherit(context)}"/> 
-1

我不知道這是否工作

%if not request.is_xhr: 
<inherit file='base.mako'/> 
%endif 

Aassuming請求是在上下文中

+0

這是行不通的。模板呈現時無法決定繼承。它必須在模塊級別塊中聲明,否則該命令將被忽略。 http://docs.makotemplates.org/en/latest/syntax.html#module-level-blocks另外,我不認爲請求被傳遞給模板,所以這會產生一個異常。 – JeffRegan

+0

我錯了有關傳遞給模板的請求。 – JeffRegan

0

可我們做了一個漂亮的相當大的重構和上面的代碼重新工作。我猜傳入的上下文沒有初始化,或者其中一個模板出現語法錯誤。

另外,請求對象有一個名爲is_xhr的屬性,如果請求是異步的,則爲true。我們使用這個屬性來確定我們是否需要加載整個頁面。所以is_page = self.request.is_xhr是False