Django отображает содержимое списка в шаблоне - PullRequest
2 голосов
/ 12 сентября 2011

Я довольно новичок в системе шаблонов 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 ]

3 голосов
/ 12 сентября 2011

Применение фильтра 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>
2 голосов
/ 12 сентября 2011

Было бы полезно, если бы вы упомянули формат данных для storeOfAuthorNames, вывод, который вы в настоящее время получаете, и то, что вы ожидаете вместо этого.

Все, что я могу сказать по вашему мнению:

  • authors (storeOfAuthorNames) производится getAuthorName(soup)
  • если checkIfValidClass(...) вернет False, вы получите NameError при попытке сослаться на storeOfAuthorNames, так как он будет необъявленным

Если бы мне пришлось угадывать, где ваша проблема основана исключительно на вашем примере шаблона, я бы сказал, что ваша проблема связана с authors|safe. Вы захотите применить фильтр safe к значению, которое вы печатаете, а не к самому списку. т.е. * +1021 *

<ul>
{ % for author in authors %}
    <li>{{ author|safe }}</li>
{ % endfor % }
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...