Django的1.5版:“URL”需要一个非空的第一个参数。 在Django 1.5改变的语法(

2019-07-19 22:05发布

我开始使用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和以上介绍的语法{从未来%%负载URL}在校正的行为,其中MyView的被看作是一个变量带来。

这样的结果是,如果你没有在你的模板中使用{从未来%%负载网址},则需要更改像{%URL MyView的%}标签{%URL“MyView的”%}。 如果您使用{从未来%%负载URL}可以直接删除的Django 1.5下该行

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

Answer 1:

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

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

它会通过所有的模板文件,并替换此:

{% url something.else foo bar %}

有了这个

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

要小心,我这个懒一点,它可能在某些构造断裂。 它仍然会更容易在一个差异不是做手工查找错误,虽然。



Answer 2:

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

现在,暂时删除url标记,并检查{{ post }}{{ post.slug }}给你所期望的值。 该错误消息arguments '('',)'表明post.slug就是问题所在。



Answer 3:

为了排除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'


Answer 4:

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

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


Answer 5:

我是从大多数这些食谱,这我能够这样做首先解决的sed的得到一个“非法的字节序列”错误:

LANG=C

然而,这些食谱产生的对我的项目吨的误报,而且我们已经有这样的人单引号,双引号,或不带引号的网址名称的组合。 这是一个烂摊子。 原来,最干净的方法是只搜索模板目录与我在正则表达式模式编辑器(崇高):

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

(发现不是已经引述的所有实例),并通过他们去视觉。 这竟然是比试图自动化,然后事后收拾残局更快,更清洁。



Answer 6:

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



文章来源: Django release 1.5: 'url' requires a non-empty first argument. The syntax changed in Django 1.5
标签: django url