主要问题是我如何以编程方式选择将某些内容放入哪个块。以下是在另一个项目中工作,但在一个新项目中,由于某种原因这不起作用。我在同一台机器上为两个项目使用相同的(默认)模板上下文处理器。
我有一个像这样的基础模板
...
{% block Title %}<h1>Whoo</h1>{% endblock %}
{% block Content %}<p>Hi there</p>{% endblock %}
...
像这样的扩展模板
{% extends "base.html" %}
...
{% block myblock.name %} <p> {{ myblock.content }} </p> {% endblock %}
<p> {{ myblock.name }} </br> {{ myblock.content }} </p>
...
然后渲染
myblock = { 'name': 'Title', 'content': 'stuff' }
return render_to_response( 'extended.html', {'myblock': myblock}, context_instance=RequestContext(request) )
我希望得到,并开始第一个项目:
...
<p> stuff <p>
<p>Hi there</p>
<p> Title </br> stuff </p>
...
但是我得到的第二个项目
...
<h1>Whoo</h1>
<p>Hi there</p>
<p> Title </br> stuff </p>
...
所以在第二个项目中,myblock dict被模板传递并处理,但似乎{%block myblock.name%}中的myblock.name被解释为文字而不是变量。关于如何强制Django评估{%block%}标签内的变量的任何想法?
答案 0 :(得分:1)
您应该再看一下有关template inheritance的文档。
...块标签定义子模板可以填充的块 in。所有块标记的作用都是告诉模板引擎一个孩子 模板可以覆盖模板的那些部分。
但是,您不会像在尝试那样直接在视图中为块分配变量。
{% block myblock.name %}
看起来也很奇怪。
要收到您期望的结果我会说模板应该看起来像这样
{% extends "base.html" %}
{% block Title %}<p>{{ myblock.content }}</p>{% endblock %}
假设您使用的是最新版本的Django,您甚至可以使用视图中的render
快捷方式简化操作:
return render(request, 'extended.html', {'name': 'Title', 'content': 'stuff'})
这将导致这样的模板:
{% extends "base.html" %}
{% block Title %}<p>{{ content }}</p>{% endblock %}