【问题标题】:Method get_context_data is called twice when using template tags in django在 django 中使用模板标签时方法 get_context_data 被调用两次
【发布时间】: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 覆盖方法时这很正常。请注意,他调用的是superget_context_data,而不是__init__
  • 如果你想创建一个包含所有上下文的包含标签,你可以使用takes_context=True,但是如果你所做的只是返回上下文,为什么不直接使用include呢?有关用例,请参阅 this question
  • 你似乎对模板标签有一些很大的误解。它们根本不应该与视图有任何关系。如果您依赖视图来呈现模板标签,那么您做错了。您应该在标签函数中定义您需要的上下文,而不是在视图中。

标签: python django


【解决方案1】:

这里似乎有两种情况。

在一种情况下,模板标签始终位于由您的 RenderView 呈现的模板中。在这种情况下,似乎不需要标签;您应该只包含 template_tag.html 或将其代码直接放入 test.html。

在另一种情况下,标记位于另一个模板中,或者位于 RenderView 可能会或可能不会呈现的模板范围内。在这种情况下,为什么要在 RenderView 中定义该页面的上下文数据?应该直接在render_myapp()中定义。

【讨论】:

  • 好的,我现在明白了。我将标签逻辑放在视图中的原因是因为我必须在不同的页面上单独显示每个标签,然后有另一个母版页(不同的应用程序)我将它们一起显示。所以 view1 将是 tag1 view2 -> tag2 然后是 viewall -> all tags。所以基本上我会有页面只有它的标签会显示,所以标签=视图。但是,是的,我只是将代码包含在标签中。
猜你喜欢
  • 2019-11-13
  • 2014-03-20
  • 2016-03-02
  • 1970-01-01
  • 2021-11-04
  • 2015-02-27
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多