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() просто сбрасывает все локальные переменные в шаблон, который до сих пор работал очень хорошо. Но эти другие переменные не являются технически "локальными", они являются частью класса, поэтому как мне передать их?

Спасибо!

Ответ 1

Добавьте 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() в качестве контекста шаблона является хорошей практикой. Я предпочитаю строить данные, переданные в шаблон явно: передать только то, что вам действительно нужно в шаблоне.

Надеюсь, что это поможет.

Ответ 2

Более простым способом сделать это может быть репликация вида шаблона 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 и указываете имя шаблона, а затем, наконец, вы можете переопределить функцию get_context_data, чтобы добавить ваши данные контекста, и это будет все, что нужно, вторая часть кода будет все, что вам нужно в вашем случае.

Ответ 3

Чтобы передать переменную метки класса внутри функции, вам нужно ссылаться на slef, который ссылается как вновь созданный объект. Как известно для доступа к любой переменной в классе, нам нужно ссылаться на объект. В противном случае он поймает глобальное имя "ваша переменная" не определено

в качестве примера в вашем случае вы можете сделать это как

класс 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