2010-11-22 25 views
0

更新1 ADDED更新的代碼的AppEngine Django的模板 - 讀取模板標籤

我在App Engine Django模板。目前我所有的數據都在幾個模板中,我想從磁盤讀取模板。非常簡單,但我想從AppEngine中的這些模板中獲取值。

例如。 file:p1.html

{%block price%}$259{%endblock%} 
{%block buy%}http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116{%endblock%} 
{%block info%}http://www.inov-8.co.nz/oroc280.html{%endblock%}  

我可以加載並將這些模板讀取到某個值並去。

template['price'] 

這將是

$259

我可以輕鬆地將數據導入模板,但我想解析出我的塊標籤之間的數據。

已更新2 在aaronasterling(THANKS)的幫助下,最終的代碼是這樣的。 從應用引擎上的Django模板中獲取值的最終代碼。 路徑= os.path.join(os.path.dirname(文件), '家/ p2.html')

file = open(path) 
    entry = file.read() 
    file.close() 
    entry = entry.replace("{% extends \"product.html\" %}","") 

    t = Template(entry) 

    product = {} 
    for node in t.nodelist[0].nodelist : 
     if hasattr(node, 'name'): 
      product[node.name] = node.render(Context()) 
+1

「我所有的數據都在幾個模板」 - 我不明白這一點。爲什麼數據在模板中? – SingleNegationElimination 2010-11-22 01:56:26

+3

這就像今天的MVC體系結構與1996年的一個網站搭配在一起。 – aaronasterling 2010-11-22 01:58:05

+0

將所有數據放在模板中並將它們放在保管箱中供我的項目經理編輯是非常簡單的 - 只有15頁數據,將所有這些在數據庫中是過分的。 – 2010-11-22 02:00:34

回答

3

聽起來就像你已經在腳下自殺了。讓我們假裝我們不要責怪和修復它:

entry = """{%block price%}$259{%endblock%} 
{%block buy%}http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116{%endblock%} 
{%block info%}http://www.inov-8.co.nz/oroc280.html{%endblock%} """ 

parsedentry = dict([(j[0].split(' ')[-1], j[-1]) for j in [i.partition("%}") for i in entry.split("{%endblock%}")] if j[0].split(' ')[-1]]) 

print parsedentry['price'] 
+0

這工作就像一個魅力!我認爲它可能只是歸結爲令牌/字符串解析器。我確實喜歡使用djangos模板解析器的aaronasterlings方法。 – 2010-11-22 02:28:39

1

更新1固定遍歷整個節點樹。

更新2實際上測試它現在它的工作。

以下是一種方法。

from django.template import Template, Context 

t = Template(template_string) # get it with open(filename).read() I guess 


def get_block_contents(t, block_name, context=None): 
    if context is None: 
     context = Context() 
    stack = t.nodelist[:] 
    while stack: 
     node = stack.pop() 
     if hasattr(node, 'name') and node.name == block_name: 
      return node.render(context) 
     if hasattr(node, 'nodelist'): 
      stack.extend(node.nodelist) 
    return False # Or raise an error 
+0

嗨,我知道我們正在接近。我得到的AttributeError:'主'對象沒有屬性'名稱' – 2010-11-22 02:21:29

+0

@約翰,你是什麼版本的Django? – aaronasterling 2010-11-22 02:22:44

+0

如果它是vanilla App引擎,那麼很可能是0.96 – SingleNegationElimination 2010-11-22 02:25:29