web-dev-qa-db-ja.com

Djangoリリース1.5: 'url'には空でない最初の引数が必要です。Django 1.5で変更された構文

Djangoリリース1.5を使い始め、古いコードで問題が発生しました。

<a href="{% url auto.views.viewpost post.slug %}"><h3>{{post.title}}</h3></a>

エラー:「url」には空でない最初の引数が必要です。 Django 1.5で構文が変更されました。ドキュメントを参照してください。ドキュメント:

注目に値する非推奨の機能の1つは、「新しいスタイル」のurlタグへの移行です。 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 from future%}を使用していた場合は、Django 1.5の下の行を削除するだけです。

次に試してみました:<a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a>が、引数 '(' '、)'とキーワード引数 '{}'が見つからない 'auto.views.view_post'のエラーReverseを取得しました。 :(私は何を間違えていますか?Thx!

67
Wolter

私はこのすべてのジャンクを手でやるのが本当に嫌いなので、私のためにsedスクリプトを書きました。最初にバックアップがあることを確認してから、テンプレートディレクトリでこれを実行します。

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

すべてのテンプレートファイルを調べて、これを置き換えます。

{% url something.else foo bar %}

これとともに

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

注意してください、私はこれに少し怠けていた、それはいくつかの構造で壊れるかもしれません。ただし、手動で行うよりも、差分内のエラーを探す方が簡単です。

89
Stephen Fuhry

.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'
4

まず、ビュー名に一重引用符、つまり_'auto.views.view_post'_を使用するのが正しいことです。

ここで、一時的にurlタグを削除し、_{{ post }}_および_{{ post.slug }}_が期待する値を提供することを確認します。エラーメッセージarguments '('',)'は、_post.slug_が問題であることを示唆しています。

3
Alasdair

_"\{% url '$1'_のような構文エラーを回避するために、_<a href="{% url "foo:bar" %}">baz</a>_に対してregexp-replace "\{% url "([\w:]+)"を実行する必要がある場合もあります

0
rioted

これらのレシピのほとんどでsedから「ILLEGAL BYTE SEQUENCE」エラーが発生していましたが、最初にこれを行うことで修正できました。

LANG=C

しかし、これらのレシピは私のプロジェクトで大量の誤検知を引き起こし、すでに一重引用符、二重引用符、または引用符なしのURL名が混在していました。それは混乱でした。最もクリーンなアプローチは、テンプレートディレクトリを正規表現モードでエディタ(Sublime)で検索することでした:

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

(まだ引用されていないすべてのインスタンスを見つけます)、それらを視覚的に調べます。それは、それを自動化してから混乱をクリーンアップしようとするよりも速くてきれいであることが判明しました。

0
shacker

Mac OSを使用している場合は、-eを渡す必要があります

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