我正在尝试在我的Django模板中执行以下操作:
{% for embed in embeds %}
{% embed2 = embed.replace("<", "<") %}
{{embed2}}<br />
{% endfor %}
然而,当我做这样的事情时,我总是得到一个无效的块或一些语法错误(我的意思是循环中的{%}}代码)。 Python没有{}来表示“范围”所以我认为这可能是我的问题?我格式化代码错了吗?
修改:确切的错误是:Invalid block tag: 'embed2'
Edit2:由于有人说Django模板不支持我正在做的事情,我重写了代码,将逻辑放在视图中。我现在有:
embed_list = []
for embed in embeds:
embed_list[len(embed_list):] = [embed.replace("<", "<")] #this is line 35
return render_to_response("scanvideos.html", {
"embed_list" :embed_list
})
但是,我现在收到错误:'NoneType' object is not callable" on line 35
。
答案 0 :(得分:7)
我很确定Django模板不支持这一点。 对于你的替换操作,我会研究不同的过滤器。
你真的应该尽量在你的视图中保留尽可能多的逻辑,而不是在模板中。
答案 1 :(得分:6)
Django的模板语言故意蹒跚而行。当非编程设计人员使用时,这绝对是一件好事,但有时候你需要进行一些编程。 (不,我不想争论。在django-users和django-dev上已多次出现。)
实现目标的两种方法:
我在几个地方使用了expr标记,它使生活更多更容易。我的下一个主要Django站点将使用jinja2。
答案 2 :(得分:3)
我不明白为什么你会得到“NoneType对象不可调用”。这应该意味着该行的某个地方是一个像“foo(...)”这样的表达式,这意味着foo是None。
BTW:您正在尝试扩展embed_list,并且更容易这样做:
embed_list = []
for embed in embeds:
embed_list.append(embed.replace("<", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})
甚至更容易使用列表理解:
embed_list = [embed.replace("<", "<") for embed in embeds]
答案 3 :(得分:2)
Django模板使用自己的语法,而不是像Kid或Genshi。
你必须推出自己的Custom Template Tag。
我猜主要原因是强制执行。就我而言,我已经很难向我们团队的设计师解释这些特殊的模板标签。如果它是普通的Python,我很确定我们根本不会选择Django。我认为还存在性能问题,Django模板基准测试速度很快,而上次检查genshi的速度要慢得多。我不知道它是否是由于免费嵌入Python而造成的。
您需要查看自己的方法并编写自己的自定义模板(或多或少与Ruby on Rails中的“帮助程序”相同),或者尝试使用其他模板引擎。
对于您的编辑,Python中有更好的语法:
embed_list.append(embed.replace("<", "<"))
我不知道它是否会修复你的错误,但至少它不是JavaScriptesque; - )
编辑2:Django自动转义所有变量。您可以使用安全过滤器强制原始HTML:{{embed|safe}}
。
你最好花一些时间阅读文档,这非常有用。
答案 4 :(得分:2)
而不是使用切片分配来增长列表
embed_list[len(embed_list):] = [foo]
你应该做的只是
embed_list.append(foo)
但实际上你应该尝试使用库函数取消html,而不是自己动手。
NonType错误听起来像embed.replace在某些时候是None,只有当你的列表不是字符串列表时才有意义 - 你可能想要用一些断言或类似的东西仔细检查它。