【发布时间】:2018-03-19 17:42:41
【问题描述】:
我有一个 template_tag.py:
from django import template
from myapp.views import RenderView
register = template.Library()
@register.inclusion_tag("template_tag.html")
def render_myapp():
rv=RenderView()
return rv.get_context_data()
和 myapp.views.py:
from django.views.generic.base import TemplateView
class RenderView(TemplateView):
template_name = "test.html"
def get_context_data(self, **kwargs):
context = super(RenderView, self).get_context_data(**kwargs)
context["test"] = 1 # this is hit twice in the debugger
return context
template_tag.html:
{% if test %}
{{ test|safe }}
{% endif %}
base.html(不同的应用):
{% load template_tag %}
{% render_myapp %}
我想知道为什么RenderView().get_context_data() 在调试器中被命中两次?我不会在我的模板中调用它两次。这可能是因为TemplateView 已经调用了get_context_data,然后我再次调用它rv.get_context_data()。但是我的template_tag.py 应该如何不再次调用 get_context_data() 呢?
【问题讨论】:
-
你为什么要在你的模板标签中调用那个方法呢?有什么意义?
-
简单地扫描你的代码,你的应用收到的每个请求都调用了 RenderView 的父级,这看起来很奇怪。考虑在 init 中初始化 super,然后使用
self.get_context_date(**kwargs)。 -
@larsl 覆盖方法时这很正常。请注意,他调用的是
super的get_context_data,而不是__init__。 -
如果你想创建一个包含所有上下文的包含标签,你可以使用
takes_context=True,但是如果你所做的只是返回上下文,为什么不直接使用include呢?有关用例,请参阅 this question。 -
你似乎对模板标签有一些很大的误解。它们根本不应该与视图有任何关系。如果您依赖视图来呈现模板标签,那么您做错了。您应该在标签函数中定义您需要的上下文,而不是在视图中。