Django 1.5版:“ url”需要一个非空的第一个参数。语法在Django 1.5中已更改


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和更高版本引入了{%from future future}语法,以引入更正的行为,其中myview被视为变量。

这样做的结果是,如果您在模板中未使用{%将来的%加载URL,则需要将{%url myview%}之类的标签更改为{%url“ myview”%}。如果您使用的是{未来的%加载网址},则可以在Django 1.5下简单地删除该行

然后我尝试了: <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> 但是对于'auto.views.view_post'却出现了错误反向,其中未找到参数'(',)'和关键字参数'{}'。:(我做错了什么?


auto在Django的PYTHONPATH?也许您需要'somedir.auto.views.view_post'那里的东西?auto.views.view_post在您的URLconf中提到了一个更明显的问题?
Lev Levitsky

Answers:


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 %}

请注意,我对此有点懒,它可能会在某些结构上中断。不过,在差异中查找错误仍然比手工操作要容易得多。


7
对于使用编辑器(ultraedit等)来解决此问题的用户。这与UNIX正则表达式为我做的工作:查找:({%URL +)([0-9A-Z _] +)替换为:\ 1 '\ 2'
托马斯Kremmel

7
对于Mac用户:find . -type f -print0 | xargs -0 sed -i.bak -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'这将为每次替换创建备份文件
Hassek

git branch fix_urls; git checkout fix_urls; 找 。型f -print0 | xargs -0 sed -i's / url([^“>] [^>] *)/ url” \ 1“ / g'; git gui /然后测试并合并。花了几分钟时间在我的项目上运行。如果您等待了5分钟,请不要惊慌
Nathan Keller

7
PyCharm:搜索(\{% *url +)([0-9a-z_.]+)并替换为{%url "$2"(或$1 "$2"保留空间)
Tom Leys 2013年

3
这是一个对我更有效的PyCharm正则表达式:搜索(\{% *url +)([0-9a-z\-_.]+)并替换为$1"$2"-它处理包含连字符的URL名称,并保留空格。
gldnspud 2014年

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'

这与问题有什么关系?
moskito-x

它可以快速解决url模板标记从django 1.4到1.5的迁移问题
Abbasov Alexander

这个问题的答案已被接受,并被投票7次!
moskito-x

3

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

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


0

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

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

1
这对我不起作用。它只是创建了一堆文件名为html-e的文件
Gourneau

这个解决方案是正确的,但是并没有说它也用sufix -e保存了所有文件的备份。
豪尔赫·雷涛

0

我在使用大多数这些配方的sed时遇到“ ILLEGAL BYTE SEQUENCE”错误,我可以通过首先执行以下操作来解决:

LANG=C

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

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

(找到所有未引用的实例)并直观地进行浏览。事实证明,与尝试使其自动化然后再清理混乱相比,这样做更快,更干净。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.