Синтаксическая ошибка всякий раз, когда я помещаю код Python в шаблон Django - PullRequest
2 голосов
/ 09 ноября 2008

Я пытаюсь сделать следующее в моем шаблоне Django:

    {% for embed in embeds %}
           {% embed2 = embed.replace("&lt;", "<") %}
           {{embed2}}<br />
    {% endfor %}

Однако я всегда получаю недопустимый блок или некоторую синтаксическую ошибку, когда делаю что-то подобное (под этим я подразумеваю код {%%} внутри цикла). Python не имеет {} для обозначения "области видимости", поэтому я думаю, что это может быть моей проблемой? Я неправильно форматирую свой код?

Редактировать: точная ошибка: Invalid block tag: 'embed2'

Edit2: Поскольку кто-то сказал, что то, что я делаю, не поддерживается шаблонами Django, я переписал код, поместив логику в представление. Теперь у меня есть:

embed_list = []
for embed in embeds:
    embed_list[len(embed_list):] = [embed.replace("&lt;", "<")] #this is line 35
return render_to_response("scanvideos.html", {
    "embed_list" :embed_list
})

Однако теперь я получаю сообщение об ошибке: 'NoneType' object is not callable" on line 35.

Ответы [ 5 ]

7 голосов
/ 09 ноября 2008

Я совершенно уверен, что шаблоны Django не поддерживают это. Для вашей замены я бы посмотрел на разные фильтры.

Вы действительно должны стараться сохранять как можно больше логики в своих представлениях, а не в шаблонах.

6 голосов
/ 10 ноября 2008

Язык шаблонов Django намеренно поврежден. Когда его используют дизайнеры, не занимающиеся программированием, это определенно хорошая вещь, но бывают случаи, когда вам нужно , чтобы немного программировать. (Нет, я не хочу об этом спорить. Это несколько раз встречалось с django-users и django-dev.)

Два способа выполнить то, что вы пытались:

  • Используйте другой шаблонизатор. См. Jinja2 для хорошего примера, который полностью объясняется для интеграции с Django.
  • Используйте тег шаблона, который позволяет вам делать выражения Python. См. Expr тег Лимоду .

Я использовал тег expr в нескольких местах, и это облегчило жизнь намного . Мой следующий крупный сайт Django будет использовать jinja2.

3 голосов
/ 09 ноября 2008

Я не понимаю, почему вы получили "объект NoneType не вызывается". Это должно означать, что где-то в строке есть выражение типа "foo (...)", и это означает, что foo - None.

Кстати: вы пытаетесь расширить embed_list, и это проще сделать так:

embed_list = []
for embed in embeds:
    embed_list.append(embed.replace("&lt;", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})

и еще проще использовать понимание списка:

embed_list = [embed.replace("&lt;", "<") for embed in embeds]
2 голосов
/ 09 ноября 2008

Вместо того, чтобы использовать назначение слайса для увеличения списка

embed_list[len(embed_list):] = [foo]

Вы, вероятно, должны просто сделать

embed_list.append(foo)

Но на самом деле вы должны попробовать убрать html с помощью библиотечной функции, а не делать это самостоятельно.

То, что ошибка NoneType звучит как embed.replace, в какой-то момент имеет значение None, что имеет смысл, только если ваш список не является списком строк - вам может потребоваться перепроверить это с некоторыми утверждениями или чем-то подобным.

2 голосов
/ 09 ноября 2008

Шаблоны Django используют собственный синтаксис, не такой как Kid или Genshi .

Вы должны свернуть свой собственный Пользовательский тег шаблона .

Я полагаю, что основная причина заключается в применении хорошей практики. В моем случае я уже с трудом объясняю эти специальные шаблоны тегов дизайнеру в нашей команде. Если бы это был простой Python, я уверен, что мы бы вообще не выбрали Django. Я думаю, что есть и проблема с производительностью, тесты шаблонов Django быстры, в то время как в прошлый раз я проверял, genshi был намного медленнее. Однако я не знаю, связано ли это со свободно встроенным Python.

Вам нужно либо пересмотреть свой подход и написать свои собственные шаблоны (более или менее синонимы "помощникам" в Ruby on Rails), либо попробовать другой механизм шаблонов.

Для вашего редактирования в Python есть лучший синтаксис:

embed_list.append(embed.replace("&lt;", "<"))

Я не знаю, исправит ли это вашу ошибку, но, по крайней мере, она менее JavaScriptesque; -)

Редактировать 2: Django автоматически экранирует все переменные. Вы можете использовать необработанный HTML с | безопасным фильтром: {{embed|safe}}.

Вам лучше потратить некоторое время на чтение документации, которая действительно хороша и полезна.

...