Django将变量从基于类的视图传递给模板

时间:2013-08-14 13:18:42

标签: django class django-templates django-views django-class-based-views

如果我有基于类的视图,就像这样,

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中,如何访问var1var2?据我所知,locals()只是将所有局部变量转储到模板中,到目前为止一直运行良好。但是这些其他变量在技术上并不是“本地的”,它们是一个类的一部分,所以如何将它们传递给它们?

谢谢!

3 个答案:

答案 0 :(得分:25)

更简洁的方法是复制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函数以添加您的上下文数据,这将是它的全部内容,第二部分代码就是你需要的所有代码。

答案 1 :(得分:18)

self.var1self.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 :(得分:3)

您可以看到here有两种方法。第一个,您可以像这样声明一个名为get_context_data的函数:

def get_context_data(self, **kwargs):          
    context = super().get_context_data(**kwargs)                     
    new_context_entry = "here it goes"
    context["new_context_entry"] = new_context_entry
    return context

如果您使用的是Django 2.x,则还必须在*args中传递get_context_data

第二种方法是在视图中的某些函数中修改extra_context变量:

self.extra_context["another_one"] = "here goes more"