[英]access variable declared in child template or controller-wide variables
我有一個小的mako模板層次結構,如下所示:
base.mako
<h1>${self.view()}</h1>
${listactions(self.mainactions)}
${self.body()}
<%def name="listactions(actions)">
<ul>
% for action in actions:
<li>${action}</li>
% endfor
</ul>
</%def>
clientsbase.mako
<%inherit file="base.mako"/>
<%def name="view()">Clients</%def>
<%
mainactions = [request.route_url('clientsnew')]
%>
clientsindex.mako
<%inherit file="clientsbase.mako"/>
This is the index
問題是當我嘗試訪問客戶端索引視圖時呈現clientsindex.mako我得到錯誤AttributeError:命名空間'self:/base.mako'沒有成員'mainactions' 。
應該怎樣做才能做到這一點? 我已經瀏覽了mako文檔,到目前為止我發現的是我可以使用模塊級python塊來聲明mainactions,然后在base.mako中執行self.attr.mainactions 。 問題在於此塊我無法訪問請求對象。
我想另一個問題是:在我的情況下,我使用函數作為view-callables,但是假設我已經編寫了一個單獨的clients.py視圖文件,其中包含與客戶端相關的所有視圖。 有沒有辦法從clients.py文件中以某種方式設置類似控制器范圍的上下文變量? 這樣我就可以在模板的上下文中設置一個mainactions變量,而不必在每個視圖的dict中返回它。
這是一個相當古老的問題,但在這里,我想它可能會成功。 請記住,當您編寫模板時,實際上您實際上是在顯示函數body()
。
我的猜測是, mainactions
被定義為self.body()
的局部變量。 但是一切都很酷,因為我們可以獲得自我...
所以不要寫:
mainactions = [request.route_url('clientsnew')]
你應該嘗試寫:
self.mainactions = [request.route_url('clientsnew')]
也就是說,這並不是實現您想要做的事情的好方法。 如果我是你,我會使用def
或block
來做。
base.mako
<h1>${self.view()}</h1>
<%block name="mainaction">
</%block>
${self.body()}
<%def name="listactions(actions)">
<ul>
% for action in actions:
<li>${action}</li>
% endfor
</ul>
</%def>
clientbase.mako
<%inherit file="base.mako"/>
<%def name="view()">Clients</%def>
<%block name="mainaction"
${request.route_url('clientsnew')}
</%block>
剩下的不會改變... def的東西是你只是覆蓋了父母的def
,然后在base.mako
你使用你想要的def
。
這就是它。
這個答案是你的“其他問題”:)
您可以將視圖定義為Controller類上的方法。 這樣,您可以將Controller范圍的變量輸出分解為常用方法:
from pyramid.view import view_config
from myproject.resources import MyResource
class MyController(object):
def __init__(self, request):
self.request = request
def respond(self, additionalVars):
additionalVars['myCommonVar1'] = 'common value'
return additionalVars
@view_config(
context='myproject.resources:MyResource',
request_method='GET',
renderer='one.mak')
def get_one(self):
return self.respond({'var2':'sth'})
@view_config(
context='myproject.resources:MyResource',
name = 'two',
request_method='GET',
renderer='two.mak')
def get_two(self):
return self.respond({'var3':'sth else'})
嗯......我已經多年沒有在掛架上寫任何東西,也沒有安裝任何掛架來檢查它。 但請嘗試編寫next.mainactions
而不是self.mainactions
,看看會發生什么。
這個答案很老,所以我不知道你是否已經解決了這個問題。
一種可行的方法是在view()def中移動你的python塊。 這樣,變量實際上將在base.mako中調用。
在我自己的應用程序中,我創建了一個view
對象,其中包含我在整個應用程序中需要的一組上下文變量,例如view.page,view.perpage等。在每個可調用的視圖上,我啟動此view
(從中計算上下文變量)自動獲取,post_data,路由等)並將其作為上下文變量傳遞。 因此,您始終可以傳遞view.mainactions,並且只要您將其保留為None,就不會遇到應用程序中的任何KeyErrors。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.