剖析Django中模版標(biāo)簽的解析與參數(shù)傳遞
分析直至另一個(gè)模板標(biāo)簽
模板標(biāo)簽可以像包含其它標(biāo)簽的塊一樣工作(想想 {% if %} 、 {% for %} 等)。 要?jiǎng)?chuàng)建一個(gè)這樣的模板標(biāo)簽,在你的編譯函數(shù)中使用 parser.parse() 。
標(biāo)準(zhǔn)的 {% comment %} 標(biāo)簽是這樣實(shí)現(xiàn)的:
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() 接收一個(gè)包含了需要分析的模板標(biāo)簽名的元組作為參數(shù)。 它返回一個(gè)django.template.NodeList實(shí)例,它是一個(gè)包含了所有Node對(duì)象的列表,這些對(duì)象是解析器在解析到任一元組中指定的標(biāo)簽之前遇到的內(nèi)容.
因此在前面的例子中, nodelist 是在 {% comment %} 和 {% endcomment %} 之間所有節(jié)點(diǎn)的列表,不包括 {% comment %} 和 {% endcomment %} 自身。
在 parser.parse() 被調(diào)用之后,分析器還沒(méi)有清除 {% endcomment %} 標(biāo)簽,因此代碼需要顯式地調(diào)用 parser.delete_first_token() 來(lái)防止該標(biāo)簽被處理兩次。
之后 CommentNode.render() 只是簡(jiǎn)單地返回一個(gè)空字符串。 在 {% comment %} 和 {% endcomment %} 之間的所有內(nèi)容都被忽略。
分析直至另外一個(gè)模板標(biāo)簽并保存內(nèi)容
在前一個(gè)例子中, do_comment() 拋棄了{(lán)% comment %} 和 {% endcomment %} 之間的所有內(nèi)容。當(dāng)然也可以修改和利用下標(biāo)簽之間的這些內(nèi)容。
例如,這個(gè)自定義模板標(biāo)簽{% upper %},它會(huì)把它自己和{% endupper %}之間的內(nèi)容變成大寫(xiě):
{% upper %}
This will appear in uppercase, {{ user_name }}.
{% endupper %}
就像前面的例子一樣,我們將使用 parser.parse() 。這次,我們將產(chǎn)生的 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()
這里唯一的一個(gè)新概念是 UpperNode.render() 中的 self.nodelist.render(context) 。它對(duì)節(jié)點(diǎn)列表中的每個(gè) Node 簡(jiǎn)單的調(diào)用 render() 。
相關(guān)文章
深入淺析python3中的unicode和bytes問(wèn)題
在python3中,有兩種字符串類(lèi)型,默認(rèn)的就是str,即unicode,也叫做文本類(lèi)型。這篇文章主要介紹了python3中的unicode和bytes問(wèn)題,需要的朋友可以參考下2019-07-07
python 含子圖的gif生成時(shí)內(nèi)存溢出的方法
今天小編就為大家分享一篇python 含子圖的gif生成時(shí)內(nèi)存溢出的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5單行文本框控件QLineEdit詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5單行文本框控件QLineEdit詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
python?spotlight庫(kù)簡(jiǎn)化交互式方法探索數(shù)據(jù)分析
這篇文章主要為大家介紹了python?spotlight庫(kù)簡(jiǎn)化的交互式方法探索數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Jetson?NX?配置?pytorch的問(wèn)題及解決方法
這篇文章主要介紹了Jetson?NX?配置?pytorch的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

