1. ホーム
  2. django

[解決済み] NoReverseMatchエラーとは何ですか、またどのように修正しますか?

2022-03-13 02:29:48

質問

あるコードがあり、実行するとNoReverseMatchを投げてこう言います。

NoReverseMatch at /my_url/ Reverse for 'my_url_name' with arguments '()' and keyword arguments '{}' not found.n pattern(s) tried: []

これはどういうことですか、どうすればいいのですか?

解決方法は?

その NoReverseMatch エラーは、インストールしたアプリの URL にマッチする url パターンが Django に見つからなかったと言っています。

NoReverseMatch 例外は、与えられたパラメータに基づいて URLconf に一致する URL を特定できない場合に、 django.core.urlresolvers が発生させます。

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

  • NoReverseMatch at /my_url/

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

  • my_url_name'の逆順です。

    これは検索できないURLの名前です。

  • 引数 '()' と

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

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

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

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

    これらは、urls.py ファイルからマッチングを試みたパターンです。

まず、現在レンダリングされている 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のどちらかでこれを修正してください。

正しければ

  • 正規表現のデバッグ

    などのサイトを利用することができます。 regexr あなたのパターンがあなたが作成していると思うURLに一致するかどうかを迅速にテストするために、上部にある正規表現フィールドにURLパターンをコピーし、それがに対して一致するべきだと思う任意のURLを含めるためにテキストエリアを使用しています。

    よくある間違い

    • に対してマッチングします。 . ワイルドカード文字またはその他の正規表現文字

      特定の文字をエスケープするには \ 接頭辞

    • 小文字/大文字のみマッチング

      のどちらかを使ってみてください。 a-Z または \w ではなく a-z または A-Z

  • マッチするパターンがtryしたパターンに含まれているか確認する。

    もしここにない場合は、アプリを INSTALLED_APPS の設定(または、アプリの並び順が INSTALLED_APPS を見る必要があるかもしれません)

Djangoのバージョン

Django 1.10 では、python のパスで url を逆引きする機能は削除されました。代わりに名前付きパスを使うべきです。


それでも問題を突き止められない場合、あなたが試したこと、調べたこと (この質問にリンクできます)、そして問題に関連するコード (マッチングしている url、関連する url パターン、django がマッチングしようとしたものを示すエラーメッセージの部分、そして場合によっては INSTALLED_APPS の設定が必要です。