Django 1.5 版:'url' 需要一个非空的第一个参数。 Django 1.5 中的语法改变
Posted
技术标签:
【中文标题】Django 1.5 版:\'url\' 需要一个非空的第一个参数。 Django 1.5 中的语法改变【英文标题】:Django release 1.5: 'url' requires a non-empty first argument. The syntax changed in Django 1.5Django 1.5 版:'url' 需要一个非空的第一个参数。 Django 1.5 中的语法改变 【发布时间】:2013-01-30 16:58:32 【问题描述】:我开始使用 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 from 未来 % 你可以简单地在 Django 1.5 下删除该行
然后我尝试:
<a href=“% url ‘auto.views.view_post’ post.slug %”><h3>post.title</h3></a>
但“auto.views.view_post”出现错误 Reverse,参数“(”,)”和关键字参数“”未找到。 :(
我究竟做错了什么?
谢谢!
【问题讨论】:
auto
在 Django 的 PYTHONPATH
上吗?也许你需要像'somedir.auto.views.view_post'
这样的东西?还有一个更明显的问题,你的 URLconf 中是否提到了auto.views.view_post
?
【参考方案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 %
小心,我对此有点懒惰,它可能会破坏某些构造。不过,在差异中查找错误仍然比手动查找更容易。
【讨论】:
适用于使用编辑器(ultraedit 等)解决此问题的人。这个 unix 正则表达式为我完成了这项工作: Find: (% url+ )([0-9a-z_]+) Replace With: \1'\2' 对于 mac 用户:find . -type f -print0 | xargs -0 sed -i.bak -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'
这将为每次替换创建一个备份文件
git 分支 fix_urls; git checkout fix_urls;找 。 -type f -print0 | xargs -0 sed -i 's/ url ([^" >][^ >]*)/ url "\1"/g'; git gui / 然后测试并合并。在我的项目上运行了几分钟。所以如果您等待 5 分钟,请不要惊慌
PyCharm:搜索 (\% *url +)([0-9a-z_.]+)
并替换为 %url "$2"
(或 $1 "$2"
以保留空格)
这是一个更适合我的 PyCharm 正则表达式:搜索 (\% *url +)([0-9a-z\-_.]+)
并替换为 $1"$2"
- 它处理包含连字符的 URL 名称,并保留空格。【参考方案2】:
为了排除 .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'
【讨论】:
这与问题有什么关系? 快速解决了 django 1.4 到 1.5 的 url 模板标签迁移问题 这个问题的答案已经被接受,并且被投票了 7 次!!【参考方案3】:首先,您对视图名称使用单引号是正确的,即'auto.views.view_post'
。
现在,暂时删除 url
标记,并检查 post
和 post.slug
是否为您提供了您期望的值。错误消息arguments '('',)'
表明post.slug
是问题所在。
【讨论】:
【参考方案4】:如果您使用的是 Mac OS,则需要通过 -e
find . -type f -print0 | xargs -0 sed -i -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'
【讨论】:
这对我不起作用。它只是创建了一堆文件名 html-e 这个解决方案是正确的,但并不是说它还保存了所有后缀为-e的文件的备份。【参考方案5】:我从 sed 中收到大多数这些食谱的“非法字节序列”错误,我可以通过先执行此操作来修复:
LANG=C
但是,这些食谱在我的项目中产生了大量误报,而且我们已经混合了单引号、双引号或未引用的 URL 名称。这是一团糟。原来最干净的方法是使用我的编辑器(Sublime)在正则表达式模式下搜索模板目录:
\\%\ url\ [^']
\\%\ url\ [^"]
(找到所有尚未引用的实例)并直观地浏览它们。事实证明,这比尝试将其自动化然后清理烂摊子更快、更干净。
【讨论】:
【参考方案6】:您可能还需要为"\% url '$1'
执行正则表达式替换"\% url "([\w:]+)"
以避免<a href="% url "foo:bar" %">baz</a>
等语法错误
【讨论】:
以上是关于Django 1.5 版:'url' 需要一个非空的第一个参数。 Django 1.5 中的语法改变的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 1.5 中结合 CreateView 和 DetailView