NoReverseMatchエラーとは何ですか?どのように修正しますか?


119

私はいくつかのコードを持っていて、それが実行されると、NoReverseMatchをスローして次のように言います。

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

これはどういう意味ですか。どうすればよいですか。

回答:


243

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

NoReverseMatch例外は、提供されたパラメーターに基づいてURLconf内の一致するURLを識別できない場合、django.core.urlresolversによって発生します。

デバッグを開始するには、表示されたエラーメッセージを分析することから始める必要があります。

  • / my_url /のNoReverseMatch

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

  • 「my_url_name」の逆

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

  • 引数 '()'および

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

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

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

  • n個のパターンが試行されました:[]

    これらは、照合しようとしたurls.pyファイルで見つけることができたパターンです

まず、現在レンダリングされているURL(URL、ビュー、関連するテンプレート)に関連するコードをソース内で探します。ほとんどの場合、これは現在開発中のコードの一部です。

これを行ったら、のURLを作成しようとしているコード行に到達するまで、djangoが続く順序でコードを読み通してくださいmy_url_name。繰り返しますが、これはおそらく最近変更した場所にあります。

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

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パターンを上部のregexフィールドにコピーしてから、テキスト領域を使用して、考えられるURLを含めることができます。一致する必要があります。

    よくある間違い:

    • .ワイルドカード文字またはその他の正規表現文字との照合

      特定の文字を\プレフィックスでエスケープすることを忘れないでください

    • 小文字/大文字のみに一致

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

  • 一致するパターンが試行されたパターンに含まれていることを確認します

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

Djangoバージョン

Django 1.10では、PythonパスによってURLを逆にする機能が削除されました。代わりに、名前付きパスを使用する必要があります。


それでも問題を追跡できない場合は、試行した内容、調査した内容(この質問にリンクできます)を含む新しい質問を自由に行ってから、関連するコードを問題-一致するURL、関連するURLパターン、djangoが一致させようとしたエラーメッセージの一部、およびINSTALLED_APPS該当する場合は設定。


11
最後に、dupターゲットとして提供できる標準的な回答があります
e4c5

django 1.10の名前付きパスについて詳しく説明していただけますか?
セージプーデル

2
はい、set app_name in the app's urls.py (e.g. app_name = 'my_app') ポイントがある
CK

私はこのライブ正規表現テスターがより役立つと思い
obotezat

NoReverseMatchに関するこの素晴らしいチュートリアルをありがとう!問題を整理することができました。
newmachines_xyz

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.