2

主要问题是我如何以编程方式选择将一些内容放入哪个块。以下是在不同的项目中工作,但在一个新项目中,由于某种原因这不起作用。我在同一台机器上为两个项目使用相同的(默认)模板上下文处理器。

我有一个类似这样的基本模板

...
{% 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 %} 标签内的变量的任何想法?

4

1 回答 1

2

您应该再看一下关于模板继承的文档。

...块标签定义了子模板可以填充的[...]块。块标签所做的只是告诉模板引擎子模板可以覆盖模板的那些部分。

但是您不会像您尝试做的那样直接在视图中将变量分配给块。

而且 {% 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 %}
于 2012-11-09T22:09:34.747 回答