Django发布1.5:'url'需要非空的第一个参数。 Django 1.5中的语法已更改

时间:2013-02-14 19:25:02

标签: django url

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

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

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

  

一个值得注意的弃用功能是转向“新式”网址   标签。在Django 1.3之前,解释了{%url myview%}之类的语法   不正确(Django认为“myview”是一个文字名称   视图,而不是名为myview的模板变量。 Django 1.3及以上版本   引入了{%load url from future%}语法来引入   纠正了将myview视为变量的行为。

     

这样做的结果是,如果你没有使用{%load url from   您的模板中的未来%},您需要更改{%url   myview%}到{%url“myview”%}。如果您使用的是{%load url   未来%}你可以简单地删除Django 1.5下的那行

然后我试过:  <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> 但得到错误反向'auto.views.view_post'参数'('',)'和关键字参数'{}'找不到。 :( 我究竟做错了什么? THX!

6 个答案:

答案 0 :(得分: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 %}

要小心,我对此有点懒,它可能会破坏一些结构。不过,现在仍然可以更容易地在差异中寻找错误,而不是手工操作。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

要排除.git文件夹并避免错误,MacOS会在选项-i&#39;&#39;中添加空引号。示例:

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'

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我从sed中得到了一个“ILLEGAL BYTE SEQUENCE”错误,其中包含大部分这些食谱,我首先要通过这样做来解决这个问题:

LANG=C

然而,这些食谱在我的项目中产生了大量误报,而且我们已经混合了单引号,双引号或不引用的网址名称。这是一团糟。事实证明,最简洁的方法是在regex模式下使用我的编辑器(Sublime)搜索模板目录:

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

(查找尚未引用的所有实例)并直观地浏览它们。事实证明,比试图自动化然后清理混乱更快更清洁。

答案 5 :(得分:0)

您可能还需要为"\{% url "([\w:]+)"执行正则表达式替换"\{% url '$1',以避免语法错误,例如<a href="{% url "foo:bar" %}">baz</a>