web-dev-qa-db-ja.com

NoReverseMatchエラーとは何ですか、どうすれば修正できますか?

私はいくつかのコードを持っており、それが実行されると、NoReverseMatchを投げます。

/ my_urlでのNoReverseMatch /引数が '()'でキーワード引数が{{} 'の' my_url_name 'の逆引きが見つかりません。 nパターン試行しました:[]

これはどういう意味ですか、そして私はそれについて何ができますか?

86
Sayse

NoReverseMatch エラーは、DjangoがあなたがインストールしたアプリのURLの中であなたが提供したURLにマッチするURLパターンを見つけることができないことを言っています。

指定されたパラメータに基づいてURLconf内の一致するURLを特定できない場合、Django.core.urlresolversによってNoReverseMatch例外が発生します。

それをデバッグし始めるためには、あなたはあなたに与えられたエラーメッセージに影響を与えることから始める必要があります。

  • / my_url /のNoReverseMatch

    これは現在レンダリングされているURLです。アプリケーションが現在アクセスしようとしているURLですが、一致しないURLが含まれています

  • 'my_url_name'を元に戻す

    これは見つけることができないURLの名前です

  • 引数 '()'と

    これらは、URLに提供されるキーワードではない引数です。

  • キーワード引数 '{}'が見つかりません。

    これらはURLに提供するキーワード引数です

  • nパターン試行しました:[]

    これらは、一致させようとしたurls.pyファイルで見つけられたパターンです。

現在レンダリングされているURL(URL、ビュー、および関連するすべてのテンプレート)に関連するソース内のコードを見つけることから始めます。ほとんどの場合、これは現在開発中のコードの一部になります。

これが終わったら、my_url_nameのURLを作成しようとしているコードの行に達するまで、Djangoが従う順番でコードを読みます。繰り返しますが、これはおそらく最近変更した場所にあります。

エラーが発生している場所がわかったので、エラーメッセージの他の部分を使用して問題を解決します。

URL名

  • 誤字はありますか?
  • 指定した名前にアクセスしようとしているURLを入力しましたか。
  • App_nameをアプリのurls.py(例えばapp_name = 'my_app')で設定した場合、またはアプリを名前空間(例えばinclude('myapp.urls', namespace='myapp'))で含めた場合は、リバース時に名前空間を含める必要があります(例:{% url 'myapp:my_url_name' %}またはreverse('myapp:my_url_name'))。

引数とキーワード引数

引数とキーワード引数は、urlパターン内の周囲の()括弧で識別できる、特定のurl内に存在するキャプチャグループとの照合に使用されます。

照合するURLに追加の引数が必要であると仮定して、エラーメッセージを調べて、最初に与えられた引数の値が正しいかどうかを調べます。

それらが正しくない場合:

  • 値がないか空の文字列

    これは一般に、渡している値には期待している値が含まれていないことを意味します。あなたがそれに値を割り当て、ブレークポイントを設定し、そしてなぜこの値が正しくパスされないのか理解する必要がある場所を見てください。

  • キーワード引数に入力ミスがあります

    これをURLパターンか、構築中のURLのどちらかで修正してください。

それらが正しいならば:

  • 正規表現をデバッグする

    regexr などのWebサイトを使用して、作成していると思われるURLとパターンが一致しているかどうかをすばやくテストし、上部の正規表現フィールドにURLパターンをコピーしてから一致させるべきだと思うURLを含めます。

    よくある間違い

    • .ワイルドカード文字または他の任意の正規表現文字とのマッチング

      \接頭辞を付けて特定の文字をエスケープすることを忘れないでください

    • 小文字/大文字に対してのみ一致

      a-Zまたは\wの代わりにa-zまたはA-Zを使用してみてください

  • マッチングしているパターンが試したパターンに含まれていることを確認してください

    ここにない場合は、INSTALLED_APPS設定内にアプリを含めるのを忘れていた可能性があります(またはINSTALLED_APPS内のアプリの順序を確認する必要があるかもしれません)。

Djangoのバージョン

Django 1.10では、pythonのパスでURLを元に戻す機能が削除されました。代わりに名前付きパスを使用してください。


それでも問題を突き止めることができない場合は、試してみたこと、調べたこと(この質問にリンクすることができます)を含む新しい質問をお気軽にお送りください。 issue - マッチしているURL、関連するURLパターン、Djangoがマッチしようとしたことを示すエラーメッセージの部分、そして該当する場合はおそらくINSTALLED_APPS設定。

178
Sayse

そして、あなたのルートがルートリストにあることを確認してください。

./manage.py show_urls | grep path_or_name

https://github.com/Django-extensions/Django-extensions

0
Daniil Mashkin