剖析Django中模版標籤的解析與參數傳遞

來源:互聯網
上載者:User
分析直至另一個模板標籤

模板標籤可以像包含其它標籤的塊一樣工作(想想 {% if %} 、 {% for %} 等)。 要建立一個這樣的模板標籤,在你的編譯函數中使用 parser.parse() 。

標準的 {% comment %} 標籤是這樣實現的:

def do_comment(parser, token):  nodelist = parser.parse(('endcomment',))  parser.delete_first_token()  return CommentNode()class CommentNode(template.Node):  def render(self, context):    return ''

parser.parse() 接收一個包含了需要分析的模板標籤名的元組作為參數。 它返回一個django.template.NodeList執行個體,它是一個包含了所有Node對象的列表,這些對象是解析器在解析到任一元組中指定的標籤之前遇到的內容.

因此在前面的例子中, nodelist 是在 {% comment %} 和 {% endcomment %} 之間所有節點的列表,不包括 {% comment %} 和 {% endcomment %} 自身。

在 parser.parse() 被調用之後,分析器還沒有清除 {% endcomment %} 標籤,因此代碼需要顯式地調用 parser.delete_first_token() 來防止該標籤被處理兩次。

之後 CommentNode.render() 只是簡單地返回一個Null 字元串。 在 {% comment %} 和 {% endcomment %} 之間的所有內容都被忽略。
分析直至另外一個模板標籤並儲存內容

在前一個例子中, do_comment() 拋棄了{% comment %} 和 {% endcomment %} 之間的所有內容。當然也可以修改和利用下標籤之間的這些內容。

例如,這個自訂模板標籤{% upper %},它會把它自己和{% endupper %}之間的內容變成大寫:

{% upper %}  This will appear in uppercase, {{ user_name }}.{% endupper %}

就像前面的例子一樣,我們將使用 parser.parse() 。這次,我們將產生的 nodelist 傳遞給 Node :

def do_upper(parser, token):  nodelist = parser.parse(('endupper',))  parser.delete_first_token()  return UpperNode(nodelist)class UpperNode(template.Node):  def __init__(self, nodelist):    self.nodelist = nodelist  def render(self, context):    output = self.nodelist.render(context)    return output.upper()

這裡唯一的一個新概念是 UpperNode.render() 中的 self.nodelist.render(context) 。它對節點列表中的每個 Node 簡單的調用 render() 。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.