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