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>