我已经从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 %}
但这不起作用。
理想情况下,我希望有一种方法可以在视图中完成所有这些操作,因为这将使我能够分别构建应用程序,然后仅使用一个视图将它们全部收集起来并将它们传递给模板。预先感谢您的帮助!
答案 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})