ree*_*oid 19 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,我如何访问var1和var2?据我所知,locals()这种方法只是将所有局部变量转储到模板中,到目前为止,该模板运行良好.但是这些其他变量在技术上并不是"本地的",它们是一个类的一部分,所以如何将它们传递给它们?
谢谢!
Cha*_*arl 26
更简洁的方法是复制Django的Template视图:
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有通用的视图,你可以用它来做各种各样的事情,我强烈建议你去查看文档以获取它们的完整列表.这些通用视图有你可以覆盖的函数来执行不受支持的自定义事物默认.在您的情况下,您只需要一个带有上下文变量的模板,这意味着您将TemplateView子类化并提供template_name,最后您可以覆盖get_context_data函数以添加您的上下文数据,这将是它的全部内容,第二部分在您的情况下,代码将是您所需要的.
ale*_*cxe 18
加入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()将模板作为上下文传递是一种很好的做法.我更喜欢明确地构造传递给模板的数据=仅传递模板中真正需要的内容.
希望有所帮助.
更新:正如 @max 在评论中指出的那样,此解决方案不适用于 Django 4.x。
正如您在此处看到的,有两种方法。第一个,您可以声明一个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"