web-dev-qa-db-ja.com

Djangoクラスベースのビューからテンプレートに変数を渡す

このようなクラスベースのビューがある場合、

_class SomeView (View):
    response_template='some_template.html'
    var1 = 0
    var2 = 1

    def get(self, request, *args, **kwargs):
        return render_to_response(self.response_template, locals(), context_instance=RequestContext(request))
_

私の質問は、テンプレート_some_template.html_内で_var1_および_var2_にアクセスするにはどうすればよいですか?私がこれを理解している限り、locals()は、すべてのローカル変数をテンプレートにダンプするだけで、これまでのところ非常にうまく機能しています。しかし、これらの他の変数は技術的に「ローカル」ではなく、クラスの一部なので、どのように渡すのですか?

ありがとう!

20
reedvoid

_self.var1_および_self.var2_をgetメソッドのコンテキストに追加します。

_class SomeView (View):
    response_template='some_template.html'
    var1 = 0
    var2 = 1

    def get(self, request, *args, **kwargs):
        context = locals()
        context['var1'] = self.var1
        context['var2'] = self.var2
        return render_to_response(self.response_template, context, context_instance=RequestContext(request))
_

また、テンプレートへのコンテキストとしてlocals()を渡すのが良い方法であるかどうかはわかりません。テンプレートに渡されるデータを明示的に構築することを好む=テンプレートで本当に必要なものだけを渡す。

お役に立てば幸いです。

18
alecxe

これを行うよりクリーンな方法は、Djangoのテンプレートビューを複製することです。

class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    A view that renders a template.  This view will also pass into the context
    any keyword arguments passed by the url conf.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

次に、それをget_context_data関数に追加します。または、テンプレート名を指定できるTemplateViewを使用して、get_context_data関数をオーバーライドすることもできます。

class SomeView(generic.TemplateView):
    var1 = 0
    var2 = 1 
    template_name = 'some_template.html'

    def get_context_data(self, **kwargs):
        context = super(SomeView, self).get_context_data(**kwargs)
        context.update({'var1': self.var1, 'var2': self.var2})
        return context

[〜#〜]編集[〜#〜]

Djangoにはさまざまな用途に使用できる汎用ビューがあります。それらの完全なリストについては docs を参照することを強くお勧めします。これらの汎用ビューには、カスタムを実行するためにオーバーライドできる関数がありますデフォルトではサポートされていないもの。あなたのケースでは、コンテキスト変数を含むテンプレートが欲しかったので、TemplateViewをサブクラス化してtemplate_nameを提供し、最後にget_context_data関数をオーバーライドしてコンテキストデータを追加できます。あなたのケースで必要なのはコードのすべてです。

26
Charl

関数内でクラスラベル変数を渡すには、新しく作成されたオブジェクトとして参照するselfで参照する必要があります。クラス内の変数にアクセスすることは知っているので、そのオブジェクトを参照する必要があります。それ以外の場合は、グローバル名「あなたの変数」が定義されていないことがキャッチされます

あなたの場合の例として、あなたはそれを次のようにすることができます

class YourView(genericView):
    template_name='your_template.html'
    var1 = 12
    var2 =1

    def get(self, **kwargs):
        context = locals()
        context['var1'] = self.var1
       context['var2'] = self.var2
       return context
0
Projesh Bhoumik