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

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))
Run Code Online (Sandbox Code Playgroud)

我的问题是,在模板中some_template.html,我如何访问var1var2?据我所知,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)
Run Code Online (Sandbox Code Playgroud)

然后将其添加到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
Run Code Online (Sandbox Code Playgroud)

编辑

Django有通用的视图,你可以用它来做各种各样的事情,我强烈建议你去查看文档以获取它们的完整列表.这些通用视图有你可以覆盖的函数来执行不受支持的自定义事物默认.在您的情况下,您只需要一个带有上下文变量的模板,这意味着您将TemplateView子类化并提供template_name,最后您可以覆盖get_context_data函数以添加您的上下文数据,这将是它的全部内容,第二部分在您的情况下,代码将是您所需要的.


ale*_*cxe 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))
Run Code Online (Sandbox Code Playgroud)

另外,我不确定locals()将模板作为上下文传递是一种很好的做法.我更喜欢明确地构造传递给模板的数据=仅传递模板中真正需要的内容.

希望有所帮助.

  • 我同意使用locals()是不好的做法。您可以明确地说,只需使用get_context_data()重写即可-在基于类的视图中,这被认为是将变量传递到模板的标准方法。 (3认同)

AK *_* 12 6

更新:正如 @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
Run Code Online (Sandbox Code Playgroud)

如果您使用 Django 2.x,您也必须*args传入get_context_data

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

self.extra_context["another_one"] = "here goes more"
Run Code Online (Sandbox Code Playgroud)