我开始使用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!
答案 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>