簡體   English   中英

在子模板或控制器范圍的變量中聲明的訪問變量

[英]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')]

也就是說,這並不是實現您想要做的事情的好方法。 如果我是你,我會使用defblock來做。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM