Django版本1.5:'url'需要一个非空的第一个参数。 在Django 1.5中更改了语法

我开始使用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的模板variables)。 Django 1.3及更高版本引入了{%load url from future%}语法来引入更正的行为,其中myview被视为一个variables。

这样做的结果是,如果您在模板中未使用{%load url from future%},则需要将{%url myview%}这样的标记更改为{%url“myview”%}。 如果你使用{%load url from future%},你可以直接在Django 1.5下删除这行

然后,我尝试: <a href=“{% url 'auto.views.view_post' post.slug %}”><h3>{{post.title}}</h3></a>但得到错误反向的' auto.views.view_post'带有参数'('',)'和关键字参数'{}'找不到。 :(我在做什么错?Thx!

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

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

它会通过所有的模板文件并将其replace为:

 {% url something.else foo bar %} 

有了这个

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

小心一点,我对此有点懒,可能会在一些结构上打破。 尽pipe如此,在差异中寻找错误还是要比手工更容易。

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

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

要排除.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' 

如果您使用Mac OS,则需要传递-e

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

我从sed中得到了一个“ILLEGAL BYTE SEQUENCE”的错误,其中大部分的这些食谱,我可以通过这样做来解决:

 LANG=C 

然而,这些食谱在我的项目上产生了大量的误报,而且我们已经混合了单引号,双引号或不带引号的url名称。 这是一个烂摊子。 原来,最简洁的方法是用正则expression式模式search我的编辑器(Sublime)的模板目录:

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

(find所有尚未引用的实例)并通过它们直观地进行查看。 事实certificate,它比自动化,然后清理混乱更快,更清洁。

你可能还需要为"\{% url '$1'replace"\{% url "([\w:]+)"来替代<a href="{% url "foo:bar" %}">baz</a>