在django的继承模板中找不到来自不同视图函数的不同内容的方法

时间:2016-08-24 12:45:14

标签: django django-templates

我是Django的新工作,我需要做的事情看起来很简单,但还不能做到。这是问题,我有想法创建一个包含大量模板的大项目,并希望在所有模板中使用包含用户名的相同栏。因此,我创建了一个base.html模板,其中包含一些内容,例如用户名和其他内容。我还有一个child.html,其他内容像城市列表那样扩展了我的base.html 我的问题是,当我运行child.html模板时,我的base.html中的视图功能内容就像用户名不显示一样。 这就是我在做的事情:

我的用户名视图:

def userview(request):
    a = User.objects.get(pk=1)
    return render(request,'base.html',{'a': a})

我的base.html模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    {{a.username}}
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="">Home</a></li>
            <li><a href="">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

我对城市的看法列表:

def regionesli(request):
    regioneslista = Regiones.objects.all()
    return render(request,'child.html',{"resultados": regioneslista})

我的Child.html模板:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in resultados %}
    <p>{{ entry.nombre_region }}</p>
{% endfor %}
{% endblock %}

1 个答案:

答案 0 :(得分:0)

如果您只想打印当前用户,那么如果正确的模板上下文处理器处于活动状态,则user模板变量应该可用。只需在模板中调用{{ user.username }}即可。无需将User对象传递到上下文中。相关文档here

但是如果由于某种原因,你必须传递一个完全不同的对象,那么你的城市列表视图代码也必须传递相同的对象。这是因为在您的示例代码中,上下文变量不会被继承,因此您必须执行此类操作。

def userview(request):
    a = SomeObject
    return render(request,'base.html',{'a': a})

def regionesli(request):
    a = SomeObject
    regioneslista = Regiones.objects.all()
    return render(request,'child.html',{'resultados': regioneslista, 'a': a})

如果你想要更干的方式来做,即不仅继承模板而且继承上下文变量,那么我建议你研究Class-based views。如果这样实现,它将看起来像这样:

class UserView(TemplateView):
    template_name = 'path/to/base.html'

    def get_context_data(self, **kwargs):
        context = super(UserView, self).get_context_data(**kwargs)
        context['a'] = SomeObject
        return context

class CitiesListView(UserView):
    template_name = 'path/to/child.html'

    def get_context_data(self, **kwargs):
        # context['a'] will be available once you call the next line
        context = super(CitiesListView, self).get_context_data(**kwargs)
        context['resultados'] = Regiones.objects.all()
        # You can add more context variables here
        return context

它可能看起来像更多的代码,但区别在于如果城市列表视图继承自用户视图,那么上下文变量也是继承的,如果有大量的上下文变量要继承,它会有很大的帮助。