67

我开始使用 Django 1.5 版,但我的旧代码出现了问题:

<a href="{% url auto.views.viewpost post.slug %}"><h3>{{post.title}}</h3></a>

错误:“url”需要一个非空的第一个参数。Django 1.5 中的语法发生了变化,请参阅文档。文件:

一个值得注意的弃用功能是转向“新型” url 标签。在 Django 1.3 之前,像 {% url myview %} 这样的语法被错误地解释(Django 认为“myview”是视图的文字名称,而不是名为 myview 的模板变量)。Django 1.3 及更高版本引入了 {% load url from future %} 语法,以引入将 myview 视为变量的更正行为。

这样做的结果是,如果您没有在模板中使用 {% load url from future %},则需要将 {% url myview %} 等标签更改为 {% url "myview" %}。如果您使用 {% load url from future %} 您可以简单地在 Django 1.5 下删除该行

然后我尝试了: <a href=“{% url ‘auto.views.view_post’ post.slug %}”&gt;<h3>{{post.title}}</h3></a> 但是'auto.views.view_post'的错误Reverse带有参数'('',)'和关键字参数'{}'未找到。:(我做错了什么?谢谢!

4

6 回答 6

89

我真的很讨厌手工做这些垃圾,所以我写了一个 sed 脚本来帮我做。确保你有一个备份,然后在你的模板目录中运行它:

find . -type f -print0 | xargs -0 sed -i 's/{% url \([^" >][^ >]*\)/{% url "\1"/g'

它将遍历您的所有模板文件并替换它:

{% url something.else foo bar %}

有了这个

{% url "something.else" foo bar %}

小心,我对此有点懒惰,它可能会破坏某些构造。不过,在 diff 中查找错误仍然比手动查找更容易。

于 2013-03-12T23:05:21.483 回答
4

为了排除 .git 的文件夹并避免错误的 MacOS 在选项 -i '' 中添加了空引号。例子:

find . -path '*/.git*' -prune -o -type f -print0 | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g'

但我喜欢这种方法(MacOS):

grep '{% url' -lrZ . | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g'
于 2013-05-07T22:19:40.827 回答
3

首先,您对视图名称使用单引号是正确的,即'auto.views.view_post'.

现在,暂时删除url标签,并检查它{{ post }}{{ post.slug }}为您提供您期望的值。错误消息arguments '('',)'表明这post.slug是问题所在。

于 2013-02-14T19:49:18.263 回答
0

如果您使用的是 Mac OS,则需要通过 -e

find . -type f -print0 | xargs -0 sed -i -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'
于 2013-03-30T10:27:32.317 回答
0

在大多数这些食谱中,我从 sed 收到“非法字节序列”错误,我可以通过首先执行以下操作来修复:

LANG=C

然而,这些食谱在我的项目中产生了大量的误报,而且我们已经混合了单引号、双引号或未引用的 url 名称。这是一团糟。原来最干净的方法是使用我的编辑器(Sublime)在正则表达式模式下搜索模板目录:

\{\%\ url\ [^']
\{\%\ url\ [^"]

(找到所有尚未引用的实例)并直观地浏览它们。事实证明,这比尝试将其自动化然后清理烂摊子更快、更干净。

于 2013-08-14T22:54:37.883 回答
0

您可能还需要执行 regexp-replace "\{% url "([\w:]+)"for"\{% url '$1'以避免语法错误,例如<a href="{% url "foo:bar" %}">baz</a>

于 2015-04-01T14:28:31.087 回答