4

(データベースから) 動的コンテンツをテンプレートにプルしています。これは単純な CMS システムと考えることができます。コンテンツ文字列にはテンプレート変数が含まれています。このように(単純化されたケース):

vars['current_city'] = "London"
vars['content'] = 'the current city is: {{current_city}}'  #this string comes from db
return render_template(request, 'about_me.html',vars)

次にテンプレートで:

{{content}}

出力は明らかに:
現在の都市は: {{current_city}}
期待:
現在の都市は: ロンドン

私の質問 - 変数名を別の変数内にレンダリングする方法はありますか? カスタム テンプレート タグ/フィルターを使用することは良い考えのようですが、成功しないものを作成しようとしていました...これを解決する方法はありますか?

4

1 に答える 1

4

カスタム タグを使用すると、おそらくこの問題を解決できますが、すべてのテンプレートを db に保存することを制限するものがないため、テンプレート内に完全なテンプレートが含まれる可能性があるため、少し複雑になる可能性があります (他のテンプレート タグが含まれる場合があります)。 )。最も簡単な解決策は、データベースからテンプレート文字列を手動でレンダリングし、それを変数としてメイン テンプレートに渡すことだと思います。

from django.template import Template, Context
...
context = {
    'current_city': 'London'
}
db_template = Template('the current city is: {{current_city}}') # get from db
context['content'] = db_template.render(Context(context))
return render_template(request, 'about_me.html', context)

ノート:

この道をたどると、ビューを実行するたびに db テンプレートをコンパイルする必要があるため、あまり効率的ではない可能性があります。そのため、コンパイルされたバージョンの db をキャッシュしてから、適切なコンテキストを渡すことができます。以下は非常に単純なキャッシュです。

simple_cache = {}

def fooview(request):
    context = {
        'current_city': 'London'
    }
    db_template_string = 'the current city is: {{current_city}}'
    if simple_cache.has_key(db_template_string):
        db_template = simple_cache.get(db_template_string)
    else:
        simple_cache[db_template_string] = Template(db_template_string)
    context['content'] = db_template.render(Context(context))
    return render_template(request, 'about_me.html', context)
于 2012-10-10T04:13:05.897 に答える