Django在模板中显示列表内容

3 投票
2 回答
8278 浏览
提问于 2025-04-17 02:05

我对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>

撰写回答