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

спасибо!

3 ответов


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

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


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


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

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

класс YourView (genericView): your_template имя_шаблона='.HTML-код' переменная1 = 12 переменная2 =1

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