我是Django模板系统的新手 - 基本上,我正在尝试打印出我在上下文中传递给django的列表的所有内容。
我的urls.py的相关部分在这里 -
url(r'^class/$', twobooks.classes.views.getAllInformation, {'template_name':'classes/displayBooks.html'}),
现在,在我的观点中,getAllInformation如下 -
def getAllInformation(searchTerm,template_name):
nameAndNumberStore = modifySearchTerm(searchTerm)
url = modifyUrl(nameAndNumberStore)
soup = getHtml(url)
information = []
if (checkIfValidClass(soup,nameAndNumberStore)):
storeOfEditions = getEdition(soup)
storeOfAuthorNames = getAuthorName(soup)
storeOfBookNames = getBookNames(soup)
storeOfImages = getImages(soup)
information.append(storeOfAuthorNames)#REMEMBER this is a list of two lists
information.append(storeOfEditions)
return render_to_response(
template_name,
{'authors': storeOfAuthorNames},
)
和displayBooks.html如下 -
<html>
<head>
<body>
<h1>Testing the class page backend</h1>
<ul>
{ % for author in authors|safe% }
<li>{{ author }}</li>
{ % endfor % }
</ul>
</body>
</html>
我认为这很简单,但我不确定发生了什么,所以我想请求一些帮助 - 谢谢!
答案 0 :(得分:3)
应用safe
过滤器会将任何转换为字符串。如果你从文字[1, 2, 'foo', u'bar']
开始,你最终会得到大约文字u"[1, 2, 'foo', u'bar']"
(或类似的东西 - 我不太确定它是如何呈现的,因为我从未尝试过这样做;我也说“大约”,因为它实际上是一个SafeString
实例而不是unicode
实例)。然后,迭代将遍历生成的字符串中的每个字符,这不是您想要的。
相反,您可以使用safeseq
过滤器将safe
过滤器应用于序列中的每个元素,
<ul>
{% for author in authors|safeseq %}
<li>{{ author }}</li>
{% endfor %}
</ul>
或者,您可以将safe
应用于迭代器内的值。
<ul>
{% for author in authors %}
<li>{{ author|safe }}</li>
{% endfor %}
</ul>
我建议使用safeseq
,因为如果您愿意,可以使用unordered_list
过滤器进一步优化模板,如果您只想显示值。 (请注意,我不确定它的行为方式 - 这可能会将其标记为安全。您需要尝试它。)
<ul>{{ authors|safeseq|unordered_list }}</ul>
答案 1 :(得分:2)
如果您提到storeOfAuthorNames
的数据格式,您当前获得的输出以及您期望的内容,那将会有所帮助。
我能从你的观点看出:
authors
(storeOfAuthorNames
)由getAuthorName(soup)
checkIfValidClass(...)
返回False
,则在尝试引用NameError
时最终会得storeOfAuthorNames
,因为它将是未声明的如果我必须根据您的示例模板猜测问题的位置,我会说问题出在authors|safe
上。您需要对要打印的值应用safe
过滤器,而不是列表本身。即。
<ul>
{ % for author in authors %}
<li>{{ author|safe }}</li>
{ % endfor % }
</ul>