67

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 %}”&gt;<h3>{{post.title}}</h3></a> しかし、引数 '('',)' とキーワード引数 '{}' が見つからない 'auto.views.view_post' のエラー Reverse が発生しました。:(何が間違っているのですか?Thx!

4

6 に答える 6

89

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

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

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

{% url something.else foo bar %}

これとともに

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

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

于 2013-03-12T23:05:21.483 に答える
4

.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'
于 2013-05-07T22:19:40.827 に答える
3

まず、ビュー名に一重引用符を使用するのは正しかったです'auto.views.view_post'

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

于 2013-02-14T19:49:18.263 に答える
0

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

LANG=C

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

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

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

于 2013-08-14T22:54:37.883 に答える
0

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

find . -type f -print0 | xargs -0 sed -i -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'
于 2013-03-30T10:27:32.317 に答える
0

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

于 2015-04-01T14:28:31.087 に答える