国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2019-11-25 17:09:29
字體:
來源:轉載
供稿:網友

分析直至另一個模板標簽

模板標簽可以像包含其它標簽的塊一樣工作(想想 {% 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() 只是簡單地返回一個空字符串。 在 {% 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() 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马尔康县| 马龙县| 华宁县| 淮南市| 阜城县| 乃东县| 宁乡县| 万盛区| 安徽省| 仙游县| 台江县| 镇沅| 诸城市| 威海市| 巨野县| 南丹县| 霍山县| 都安| 昌乐县| 奇台县| 石景山区| 盐亭县| 嵊泗县| 衡阳县| 平利县| 郑州市| 陆河县| 永平县| 湖北省| 汕头市| 化州市| 吉林市| 扎赉特旗| 寻乌县| 舟山市| 香格里拉县| 文登市| 青海省| 隆昌县| 五华县| 凤阳县|