在django中使用模板标记时,方法get_context_data被调用两次

时间:2018-03-19 17:42:42

标签: python django

我有一个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()?

1 个答案:

答案 0 :(得分:2)

这里似乎有两种情况。

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

在另一种情况下,标记位于另一个模板中,或者在RenderView可能呈现或不呈现的一系列模板中。在这种情况下,为什么在RenderView中定义该页面的上下文数据?它应该直接在const Tabs = TabNavigator({ Feed: { screen: FeedPage, navigationOptions: { tabBarLabel:"Feed", tabBarIcon: () => (<Image source={require('./Resources/Images/TabBar Icons_Feed.png')} style={{height: 10, width: 10}} />) } }, Me: { screen: MePage, navigationOptions: { tabBarLabel:"Me", } }, }, { initialRouteName: 'Me', tabBarOptions: { showIcon: true, showLabel: true } } ); const RootStack = StackNavigator( { //All Tabs Tabs: { screen: Tabs, }, //Other Pages Signup: { screen: SignupPage, }, ProfilePicUploader: { screen: ProfilePicUploaderPage, }, Login: { screen: LoginPage, }, User: { screen: UserPage, }, EasterEgg: { screen: EasterEggPage, }, }, { initialRouteName: 'Tabs', headerMode: 'none' } ); export default class App extends Component<Props> { render() { return ( <RootStack/> ); } }

中定义