10

アプリ内のすべてのテンプレートに変数 (ブラウザー変数) を渡そうとしています。それを機能させる方法に関するアドバイスはありますか?

意見:

def browser(request):
    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))
    return render_to_response('reserve/templates/base.html', locals(), context_instance=RequestContext(request))

テンプレート:

{% for prod in browser %} {{ prod }}, {% endfor %}
4

3 に答える 3

14

あなた、私の友人は、コンテキスト プロセッサの市場にいます。

私よりもはるかに機敏で博学なテクニカル ライターが書いたブログ エントリから:

テンプレート コンテキスト プロセッサとは

Django のコンテキスト プロセッサは、テンプレートにデータとコールバックを提供できる機能です。

これは、次の 2 つの方法のいずれかで行うことができます。

  • 個々のリクエストごとに: カスタムContext値をrender_to_response()呼び出しに渡す
  • グローバル:HttpRequestオブジェクトを入力として受け取り、ペイロードまたはコールバックを返すコンテキスト プロセッサ メソッドを作成し、コンテキスト プロセッサを に登録してから、呼び出しに独自の属性ではなく組み込みの属性settings.pyを提供します(いつでも次のように拡張できます) 。もちろん、個々のリクエストに基づいてデータを追加します)。render_to_response()RequestContextRequestContext

テンプレートにデータを渡すためのこのアプローチがばかげて難読化されているように聞こえる場合は、あなただけではありません。このような単純な操作に伴う複雑さは不当で非生産的ですが、どのシステムにも欠点があります。

公式ドキュメントは次のとおりです。

https://docs.djangoproject.com/en/dev/ref/templates/api/

そうですが、ええ、私はしばらくの間 Django でプログラミングを行ってきました。私が Django で問題を解決するのが本当に好きな理由の 1 つは、Django の複雑さはほとんどビザンチン的ですが、横暴な方法ではないからです。すぐには役に立たないように見えるかもしれない、たくさんのジーゴーとドゥーダーがあります。これらはそれぞれ、必要なときに非常に便利であり、そうでない場合は邪魔になりません。

ここでの結論は、コンテキスト プロセッサがその良い例です。はい。

于 2012-08-20T00:49:50.000 に答える
4

現在、変数スコープとして渡さlocals()れていますが、これも含める必要がありbrowserますが、使用方法はlocals()非常に醜いです。

個人的には、代わりに次のようなパターンを常に好みます。

def browser(request):
    context = RequestContext(request)

    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))

    context['browser'] = browser

    return render_to_response('reserve/templates/base.html', context_instance=context)
于 2012-08-19T23:02:42.833 に答える
4

正常に動作する私のコードの例をあげることができます。という名前のファイルは次のcontext_processors.pyとおりです。

context_processors.py

def base(request):
    user = request.user

#======================
#Login form
#=====================

# here is the code for login user or check if he is logged in already

return  {
        'user': user,
        }

これは base.html の一部です (すべてのページで使用するテンプレート)

base.html

{% if user.username %}
                    <h3>
                        Welcome {{ user.username }}
                    </h3>
于 2012-08-20T02:54:47.477 に答える