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 下删除该行

然后我尝试: &lt;a href=“% url ‘auto.views.view_post’ post.slug %”&gt;&lt;h3&gt;post.title&lt;/h3&gt;&lt;/a&gt; 但“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 \([^" &gt;][^ &gt;]*\)/ 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:]+)" 以避免&lt;a href="% url "foo:bar" %"&gt;baz&lt;/a&gt; 等语法错误

【讨论】:

以上是关于Django 1.5 版:'url' 需要一个非空的第一个参数。 Django 1.5 中的语法改变的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.5 中结合 CreateView 和 DetailView

命名 url 在 django 1.5 和 python 2.7 中不起作用

urls.py django 2.0.2 需要参数

Django Admin后台管理功能使用(学习版)

django 1.5 管理员内联额外

社区版pycharm创建django项目的一些问题