剖析Django中模版標簽的解析與參數傳遞
分析直至另一個模板標簽
模板標簽可以像包含其它標簽的塊一樣工作(想想 {% if %} 、 {% for %} 等)。 要創(chuàng)建一個這樣的模板標簽,在你的編譯函數中使用 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 %} 之間所有節(jié)點的列表,不包括 {% comment %} 和 {% endcomment %} 自身。
在 parser.parse() 被調用之后,分析器還沒有清除 {% endcomment %} 標簽,因此代碼需要顯式地調用 parser.delete_first_token() 來防止該標簽被處理兩次。
之后 CommentNode.render() 只是簡單地返回一個空字符串。 在 {% 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) 。它對節(jié)點列表中的每個 Node 簡單的調用 render() 。
相關文章
python GUI庫圖形界面開發(fā)之PyQt5單行文本框控件QLineEdit詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5單行文本框控件QLineEdit詳細使用方法與實例,需要的朋友可以參考下2020-02-02
python?spotlight庫簡化交互式方法探索數據分析
這篇文章主要為大家介紹了python?spotlight庫簡化的交互式方法探索數據,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01

