2010-11-22 5 views
0

UPDATE 1 追加、更新CODEAppEngineのジャンゴテンプレート - 読むのテンプレートタグ

私はApp Engineの上のDjangoテンプレートを持っています。現在、私のすべてのデータはいくつかのテンプレートにあり、ディスクからテンプレートを読みたいと思います。非常に簡単ですが、AppEngineのこれらのテンプレートから値を取得したいと思います。

例えば、ファイル: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%}  

これらのテンプレートをいくつかの値に読み込んで読み込むことはできますか。

$259

だろう

template['price'] 

私は簡単にテンプレートにデータを挿入することができますが、私は私のブロックタグ間のデータを解析します。 aaronasterlingのヘルプ(THANKS)で

UPDATED 2 は、最終的なコードは、このです。 アプリエンジン上の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

"すべてのデータはいくつかのテンプレートにあります" - 私はこれを理解していません。テンプレート内のデータはなぜですか?これらすべてを入れて、データの唯一の15ページ - – SingleNegationElimination

+3

テンプレート内のすべてのデータを入れて、編集するための私のプロジェクトマネージャのためのDropboxにこれらを入れてはるかに簡単だった1996年 – aaronasterling

+0

からウェブサイトと交配今日MVCアーキテクチャの最高のようなものですDB内で過度の攻撃を受けました。 –

答えて

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アプローチが好きでした。 –

1

Update 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を取得しています: 'Main'オブジェクトに属性 'name'がありません –

+0

@John、あなたはどんなバージョンのdjangoですか? – aaronasterling

+0

バニラのApp Engineの場合、おそらく0.96 – SingleNegationElimination

関連する問題