3

我正在尝试在我的 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.

4

5 回答 5

7

我很确定 Django 模板不支持这一点。对于您的替换操作,我会研究不同的过滤器。

你真的应该尽量在视图中而不是在模板中保留尽可能多的逻辑。

于 2008-11-09T19:44:06.090 回答
6

Django 的模板语言是故意蹩脚的。当被非编程设计师使用时,这绝对是一件好事,但有时你需要做一点编程。(不,我不想为此争论。这在 django-users 和 django-dev 上已经出现了好几次。)

两种方法来完成你正在尝试的事情:

  • 使用不同的模板引擎。有关与 Django 集成的完整说明,请参见Jinja2 。
  • 使用允许您执行 Python 表达式的模板标签。请参阅limodou 的 Expr 标签

我在几个地方使用了 expr 标签,它让生活变得更加轻松。我的下一个主要 Django 站点将使用 jinja2。

于 2008-11-10T01:25:36.913 回答
3

我不明白为什么你会得到“NoneType object is not callable”。这应该意味着该行的某处是像“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]
于 2008-11-09T20:04:59.947 回答
2

Django 模板使用自己的语法,不像KidGenshi

您必须滚动您自己的自定义模板标签

我想主要原因是执行良好的做法。就我而言,我已经很难向我们团队的设计师解释这些特殊的模板标签。如果是纯 Python,我敢肯定我们根本不会选择 Django。我认为还有一个性能问题,Django 模板基准测试很快,而我上次检查 genshi 时要慢得多。不过,我不知道这是否是由于免费嵌入了 Python。

您要么需要检查您的方法并编写自己的自定义模板(或多或少是 Ruby on Rails 中“助手”的同义词),要么尝试使用其他模板引擎。

对于您的编辑,Python 中有更好的语法:

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

我不知道它是否能解决你的错误,但至少它不像 JavaScriptesque ;-)

编辑 2:Django 自动转义所有变量。您可以使用 |safe filter : 强制执行原始 HTML {{embed|safe}}

您最好花一些时间阅读文档,这真的很棒而且很有用。

于 2008-11-09T19:58:50.787 回答
2

而不是使用切片分配来增长列表

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

你可能应该这样做

embed_list.append(foo)

但实际上,您应该尝试使用库函数对 html 进行转义,而不是自己动手。

NoneType 错误在某些时候听起来像 embed.replace 是 None ,这仅在您的列表不是字符串列表时才有意义 - 您可能需要使用一些断言或类似的东西仔细检查。

于 2008-11-09T20:04:55.097 回答