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