首页 文章

Django发布1.5:'url'需要非空的第一个参数 . Django 1.5中的语法已更改

提问于
浏览
66

我开始使用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 future%},则需要将{%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!

6 回答

  • 3

    我真的很讨厌手工制作所有这些垃圾,所以我写了一个sed脚本来为我做 . 确保先备份,然后在模板目录中运行:

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

    它将遍历所有模板文件并替换为:

    {% url something.else foo bar %}
    

    有了这个

    {% url "something.else" foo bar %}
    

    小心,我对此有点懒,它可能会破坏一些结构 . 不过,现在仍然可以更容易地在差异中查找错误而不是手动执行错误 .

  • 3

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

    现在,暂时删除 url 标记,并检查 {{ post }}{{ post.slug }} 是否为您提供了所需的值 . 错误消息 arguments '('',)' 表明 post.slug 是问题所在 .

  • 0

    要排除.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'
    
  • 89

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

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

    我从sed中得到了一个“ILLEGAL BYTE SEQUENCE”错误,其中包含大部分这些食谱,我可以通过以下方式解决这个问题:

    LANG=C
    

    然而,这些食谱在我的项目中产生了大量误报,我们已经混合了单引号,双引号或不引用的url名称 . 这是一团糟 . 事实证明,最简洁的方法是在regex模式下使用我的编辑器(Sublime)搜索模板目录:

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

    (查找尚未引用的所有实例)并直观地浏览它们 . 事实证明,比试图自动化然后清理混乱更快更清洁 .

  • 0

    您可能还需要为 "\{% url '$1' 执行regexp-replace "\{% url "([\w:]+)" 以避免语法错误,例如 <a href="{% url "foo:bar" %}">baz</a>

相关问题