1

仕事:

Webアプリの設計の実用的な背景。Webページはプロトタイプオブジェクト、ガジェットから構築され、それぞれが独自のview関数(独自のコード、必ずしもdjango-view関数ではない)で個別に定義されています。また、「本番」Webページを作成するために、このページに関連する通常のビューに配置し、指定されたソースデータやその他のパラメーターに従ってWebページ要素を作成できます。たとえば、チャートガジェットがあり、ソースデータ、パラメータ、チャートタイプ、美しさ/色などを受け取り、チャートを描画します。特定のap、緩く結合されたコードとは別に保存するにはどうすればよいですか?どの設計アプローチが優れていますか?

私が試したこと:

私は「ばかげた」方法を試しました:

たとえば、私は簡単なビューを持っています:

from django.shortcuts import render_to_response
from django.template import Template, Context
from string import letters
def home(request):
    t = Template("""<ul>
                        {% for key, value in d.items %}
                            <li>{{ key }}: {{ value }}</li>
                        {% endfor %}
                    </ul>""")
    d = {k: v for v, k in enumerate(letters)}
    return render_to_response('home.html', {'t': t, 'd':d})

そしてテンプレート:

<html>
<head>
    <title>Django tests</title>

</head>
<body>
{% include t with d=d %}
</body>
</html>

そのような設定で私は得ます:TemplateDoesNotExist

答えについての期待:

ウェブアプリプログラムのバックエンドの同様に別のコードのチャンクに、ウェブページの他の要素とは多少異なり、それ自体の生活によって少し生きるように設計されたウェブページのチャンクを保存するための合理的なスキームを探しています。例として、次のようなプロジェクトを提供できます。

ありがとうございました!




ps

django-docsからの抜粋:

{%extends variable%}は変数の値を使用します。変数が文字列に評価される場合、Djangoはその文字列を親テンプレートの名前として使用します。変数がTemplateオブジェクトに評価される場合、Djangoはそのオブジェクトを親テンプレートとして使用します。

つまり、{%extends%}タグを使用すると、問題のImが話している操作が確実に可能になるということです。

この例には、変数template_nameに名前が含まれているテンプレートの内容が含まれています。

{% include template_name %}

つまり、に渡される変数は{% include %}、ファイル名の文字列だけを取得できることを意味します。そして、それが本当なら、私の質問に対する明確な答えです-変数で定義されたテンプレートを通常のテンプレートに含めることはできません。Pythonでは単語がの同義語として使用される可能性がある
ため、私にとってはまだ少しあいまいです。namevariable

4

4 に答える 4

3

コメントですでに述べたように、テンプレートを文字列にレンダリングして2番目のテンプレートに渡し、自動エスケープされないように安全な文字列としてマークする必要があります。したがって、あなたの例は次のようになります。

from django.shortcuts import render_to_response
from django.template import Template, Context
from django.utils.safestring import mark_safe
from string import letters
def home(request):
    t = Template("""<ul>
                        {% for key, value in d.items %}
                            <li>{{ key }}: {{ value }}</li>
                        {% endfor %}
                    </ul>""")
    c = Context({'d': {k: v for v, k in enumerate(letters)}})
    return render_to_response('home.html', {'t': mark_safe(t.render(c))})

次に、home.htmlで、{{ t }}

于 2013-01-11T13:37:56.463 に答える
1

インクルードテンプレートを独自のファイルに配置する必要があります

include.html:

<ul>
    {% for key, value in d.items %}
        <li>{{ key }}: {{ value }}</li>
    {% endfor %}
</ul>

home.html:

<html>
    <head>
        <title>Django tests</title>
    </head>
    <body>
        {% include 'include.html' with d=d %}
    </body>
</html>

次に、ビューは次のようになります。

def home(request):
    d = {k: v for v, k in enumerate(letters)}
    return render_to_response('home.html', {'d':d})
于 2013-01-04T15:18:40.327 に答える
1

サブテンプレートをレンダリングしてから、home.htmlテンプレートのコンテキストに配置する必要があります(tこの場合のように)。これは、以前に再帰テンプレートに使用したものです。

home.html

<html>
<head>
    <title>Django tests</title>
</head>
<body>
    {{ t }}
</body>
</html>

views.py

from django.shortcuts import render_to_response
from django.template import Template, Context
from string import letters

def home(request):
    t = Template("""<ul>
                        {% for key, value in d.items %}
                            <li>{{ key }}: {{ value }}</li>
                        {% endfor %}
                    </ul>""")
    d = {k: v for v, k in enumerate(letters)}
    t_rendered = t.render(Context({'d': d}))
    return render_to_response('home.html',
                              {'t': t_rendered})

サブテンプレートをビューの外に作成することでキャッシュできるため、すべてのリクエストでサブテンプレートが作成されるわけではないことに注意してください。loaderサブテンプレートをテンプレートファイルに保持するために使用できます。ただし、サーバーを再起動するまで、変更は反映されません。

from django.shortcuts import render_to_response
from django.template import Template, Context, loader
from string import letters

t = loader.get_template('subtemplate.html')

def home(request):
    d = {k: v for v, k in enumerate(letters)}
    t_rendered = t.render(Context({'d': d}))
    return render_to_response('home.html',
                              {'t': t_rendered})    
于 2013-01-11T23:44:08.047 に答える
0

render_to_responseショートカット操作だと思います。テンプレートを2番目のパラメーターとして使用するのではなく、コンテキストを使用すると思います

return render_to_response('home.html', {'d': d,})

<html>
<head>
    <title>Django tests</title>

</head>
<body>

<ul>
   {% for key, value in d.items %}
     <li>{{ key }}: {{ value }}
   {% endfor %}
</ul>

</body>
</html>

テンプレートディレクトリにリストテンプレートを作成し、それをテンプレートに含めることができます https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#includeincludeはテンプレートを取得する だけのようです動的テンプレートではなく名前

于 2013-01-04T15:16:27.587 に答える