如何使用include将上下文传递给Django模板?

时间:2018-10-12 16:39:40

标签: django

我已经从https://docs.djangoproject.com/en/2.1/intro/tutorial01/

的教程开始构建django项目。

完成了使用一个名为“ polls”的应用程序创建项目的基础教程之后,我想构建一种可以将许多应用程序结合在一起的主页。因此,我构建了一个名为“新闻”的应用程序,现在我正在研究将两个应用程序组合在一起的方法。

到目前为止,我已经在主要的“新闻”模板(称为“ news / base.html”)中进行了此操作,并且在代码中包含了不同的应用程序。

这是我的“ news / base.html”文件:

{% include 'news/index.html' %}
{% include polls_template %}
{% include 'news/footer.html' %}

这两个模板'news / index.html'和'news / footer.html'只是不带参数的html页面,仅用于测试并且可以正常工作。

polls_template变量是我在news.views.base函数中创建的模板变量,并在上下文中传递给模板。

这是执行此操作的视图片段:

def base(request):
    t = loader.get_template('polls/index.html')
    return render(request, 'news/base.html', {'polls_template': t})

模板显示得很好,但是由于没有参数,它显示了一个空的轮询。现在我的问题是,我找不到一种将上下文变量传递给此模板对象以填充其字段的方法。

我试图做类似的事情:

{% include polls_template with context=polls_context %}

但这不起作用。

理想情况下,我希望有一种方法可以在视图中完成所有这些操作,因为这将使我能够分别构建应用程序,然后仅使用一个视图将它们全部收集起来并将它们传递给模板。预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Django - two views, one page的可能重复项(不考虑对Ajax的引用。)快速说明:我明白了您要执行的操作,但是您应该了解render()是一个快捷方式,它既包括模板加载又包括HttpResponse()。如果使用render(),则无需调用loader()。函数的另一个问题是,您已将模板包含在上下文字典中。请阅读链接后的文章b / c,有很多不同的方法,但是为了完整起见,这是一种处理您要尝试的方法。首先,通常,您将创建一个“ base.html”文件作为内容的容器,其中将包括页眉,页脚以及可能的消息传递模板。然后,您可以扩展base.html并包括其他模板。

'base.html'

     <!doctype html>
     <html lang="en">
       <head>
        {% include 'header.html' %}
        <body>
        {% include 'news.html' %}

         {% block content %}
          //to be replaced by index/polls content that extends this template//
         {% endblock %}
         </body>
         {% include 'footer.html' %}
          </html>

'index.html'

    {% extends 'base.html' %}
     {% block content %}
      <ul>
     {% for question in questions%}
       <li> {{question}}</li>
      {% endfor %}
       </ul>
     {% endblock %}

'news.html'

     <ul>
     {% for article in news %}
       <li> {{article}}</li>
      {% endfor %}
       </ul>

然后是您的功能

    def index(request):
         polls_questions = Question.objects.all()
         newest_articles = Articles.objects.filter(post=OuterRef('pk')).order_by('-created_at')
         return render(request, 'index.html', {'questions' : polls_questions, 'news': newest_articles})