每当我将Python代码放入Django模板时,语法错误

时间:2008-11-09 19:24:41

标签: python django templates django-templates

我正在尝试在我的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 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

Django的模板语言故意蹒跚而行。当非编程设计人员使用时,这绝对是一件好事,但有时候你需要进行一些编程。 (不,我不想争论。在django-users和django-dev上已多次出现。)

实现目标的两种方法:

  • 使用其他模板引擎。有关与Django集成的完整解释的好示例,请参阅Jinja2
  • 使用允许您执行Python表达式的模板标记。见limodou's Expr tag

我在几个地方使用了expr标记,它使生活更多更容易。我的下一个主要Django站点将使用jinja2。

答案 2 :(得分:3)

我不明白为什么你会得到“NoneType对象不可调用”。这应该意味着该行的某个地方是一个像“foo(...)”这样的表达式,这意味着foo是None。

BTW:您正在尝试扩展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]

答案 3 :(得分:2)

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

你必须推出自己的Custom Template Tag

我猜主要原因是强制执行。就我而言,我已经很难向我们团队的设计师解释这些特殊的模板标签。如果它是普通的Python,我很确定我们根本不会选择Django。我认为还存在性能问题,Django模板基准测试速度很快,而上次检查genshi的速度要慢得多。我不知道它是否是由于免费嵌入Python而造成的。

您需要查看自己的方法并编写自己的自定义模板(或多或少与Ruby on Rails中的“帮助程序”相同),或者尝试使用其他模板引擎。

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

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

我不知道它是否会修复你的错误,但至少它不是JavaScriptesque; - )

编辑2:Django自动转义所有变量。您可以使用安全过滤器强制原始HTML:{{embed|safe}}

你最好花一些时间阅读文档,这非常有用。

答案 4 :(得分:2)

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

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

你应该做的只是

embed_list.append(foo)

但实际上你应该尝试使用库函数取消html,而不是自己动手。

NonType错误听起来像embed.replace在某些时候是None,只有当你的列表不是字符串列表时才有意义 - 你可能想要用一些断言或类似的东西仔细检查它。