27

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

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()这种只是将所有局部变量转储到模板中,到目前为止效果很好。但是这些其他变量在技术上不是“本地的”,它们是类的一部分,那么我该如何传递它们呢?

谢谢!

4

4 回答 4

41

一种更简洁的方法是复制 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 具有通用视图,您可以将其用于各种事情,我强烈建议您查看文档以获取它们的完整列表,这些通用视图具有您可以覆盖的功能以执行不支持的自定义事情默认。在您的情况下,您只需要一个带有上下文变量的模板,这意味着您将 TemplateView 子类化并提供 template_name,然后最后您可以覆盖 get_context_data 函数以添加您的上下文数据,这就是它的全部内容,第二部分在您的情况下,您只需要代码。

于 2013-08-14T13:28:37.883 回答
21

在方法中添加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))

注意:render_to_response()在 Django 3.0 及更高版本中被删除(render()改为使用)。

另外,我不确定将locals()作为上下文传递给模板是一种好习惯。我更喜欢显式地构造传递到模板中的数据 = 只传递模板中真正需要的数据。

于 2013-08-14T13:26:45.040 回答
4

您可以在此处看到两种方法。第一个,你可以声明一个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,你也必须传入*argsget_context_data

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

self.extra_context["another_one"] = "here goes more"
于 2020-04-19T06:06:04.537 回答
0

为了在函数中传递您的类标签变量,您需要将self哪个引用作为新创建的对象进行引用。正如我们所知,要访问类中的任何变量,我们都需要引用它的对象。否则会被抓到全局名'your variable' is not defined

作为你的例子,你可以这样做

class 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
于 2017-08-11T10:01:08.800 回答