Django在模板中显示列表内容
我对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>
我觉得这应该挺简单的,但我不太明白发生了什么,所以想请教一下大家——谢谢!
2 个回答
2
你最好说明一下storeOfAuthorNames
的数据格式、你现在得到的输出是什么,以及你期望得到的是什么。
从你的描述中,我能告诉你的是:
authors
(也就是storeOfAuthorNames
)是通过getAuthorName(soup)
这个函数生成的。- 如果
checkIfValidClass(...)
返回False
,那么当你试图引用storeOfAuthorNames
时,会出现NameError
错误,因为它还没有被声明。
如果让我根据你的示例模板猜测一下问题所在,我会说问题出在authors|safe
上。你需要把safe
这个过滤器应用在你要打印的值上,而不是在列表本身上。也就是说:
<ul>
{ % for author in authors %}
<li>{{ author|safe }}</li>
{ % endfor % }
</ul>
4
使用 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>