每当我将 Python 代码放入 Django 模板时都会出现语法错误

Posted

技术标签:

【中文标题】每当我将 Python 代码放入 Django 模板时都会出现语法错误【英文标题】:Syntax error whenever I put Python code inside a Django template 【发布时间】:2010-09-21 12:56:07 【问题描述】:

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

【问题讨论】:

确切的语法错误是什么? 【参考方案1】:

Django 模板使用自己的语法,不像 Kid 或 Genshi。

你必须自己滚动Custom Template Tag。

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

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

使用不同的模板引擎。请参阅 Jinja2 以获得一个很好的示例,该示例对与 Django 的集成进行了充分说明。 使用允许您执行 Python 表达式的模板标记。见limodou's Expr tag。

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

【讨论】:

如果将来有人从谷歌搜索中出现,Peter 提到的 Expr 标签在 Django 1.8 中仍然有效。而且它非常很有用!【参考方案3】:

我不明白为什么你会得到“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]

【讨论】:

这个列表理解对我来说好多了:)【参考方案4】:

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

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

你可能应该这样做

embed_list.append(foo)

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

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

【讨论】:

【参考方案5】:

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

您确实应该尝试在视图中而不是在模板中保留尽可能多的逻辑。

【讨论】:

您可以重写您的答案以使其更强大。故意禁止在模板中进行处理。您必须在视图函数中进行所有处理。 ...或在自定义模板标签和模板过滤器中。

以上是关于每当我将 Python 代码放入 Django 模板时都会出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

根据要求触发VS Code python调试器

如何避免 Python 模块系统中的命名冲突?

如何在 django 中将 api 放入 celery 任务中?

将现有的 css/html 页面转换为 Django

python - 使用 Django 将 Unicode 字符存储到 MySQL 时出现问题

当我将 HTML 放入“包含”中时,为啥我的 javascript 不起作用?