【问题标题】: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

标签: django url


【解决方案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; 等语法错误

      【讨论】:

        猜你喜欢
        • 2013-02-22
        • 2013-04-05
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        相关资源
        最近更新 更多