O que é um erro NoReverseMatch e como faço para corrigi-lo?


119

Eu tenho algum código e quando ele é executado, ele lança um NoReverseMatch, dizendo:

NoReverseMatch em / my_url / Reverse para 'my_url_name' com argumentos '()' e argumentos de palavra-chave '{}' não encontrados. n padrão (s) tentado (s): []

O que isso significa e o que posso fazer a respeito?

Respostas:


243

O NoReverseMatcherro está dizendo que o Django não consegue encontrar um padrão de url correspondente para o url que você forneceu em nenhum dos urls do seu aplicativo instalado.

A exceção NoReverseMatch é gerada por django.core.urlresolvers quando uma URL correspondente em seu URLconf não pode ser identificada com base nos parâmetros fornecidos.

Para começar a depurar, você precisa começar detectando a mensagem de erro fornecida a você.

  • NoReverseMatch em / my_url /

    Este é o url que está sendo renderizado no momento, é este url que seu aplicativo está tentando acessar, mas contém um url que não pode ser correspondido

  • Reverter para 'my_url_name'

    Este é o nome do url que não consegue encontrar

  • com argumentos '()' e

    Estes são os argumentos não-palavra-chave fornecidos ao url

  • argumentos de palavra-chave '{}' não encontrados.

    Estes são os argumentos de palavra-chave fornecidos ao url

  • n padrão (s) tentado (s): []

    Estes são os padrões que ele conseguiu encontrar em seus arquivos urls.py com os quais tentou fazer a correspondência

Comece localizando o código em sua fonte relevante para a url que está sendo renderizada - a url, a visualização e quaisquer modelos envolvidos. Na maioria dos casos, essa será a parte do código que você está desenvolvendo atualmente.

Depois de fazer isso, leia o código na ordem que django seguiria até chegar à linha de código que está tentando construir uma url para o seu my_url_name. Novamente, isso provavelmente está em um lugar que você mudou recentemente.

Agora que você descobriu onde o erro está ocorrendo, use as outras partes da mensagem de erro para resolver o problema.

O nome do url

  • Existem erros de digitação?
  • Você forneceu o url com o qual está tentando acessar o nome fornecido?
  • Se você definiu app_name no aplicativo urls.py(por exemplo app_name = 'my_app') ou se incluiu o aplicativo com um namespace (por exemplo include('myapp.urls', namespace='myapp'), você precisa incluir o namespace ao reverter, por exemplo, {% url 'myapp:my_url_name' %}ou reverse('myapp:my_url_name').

Argumentos e argumentos de palavras-chave

Os argumentos e argumentos de palavra-chave são usados ​​para corresponder a quaisquer grupos de captura presentes no url fornecido, que podem ser identificados pelos ()colchetes no padrão de url.

Presumindo que o url que você está correspondendo exija argumentos adicionais, dê uma olhada na mensagem de erro e primeiro verifique se o valor para os argumentos fornecidos parece estar correto.

Se eles não estiverem corretos:

  • O valor está faltando ou uma string vazia

    Isso geralmente significa que o valor que você está transmitindo não contém o valor que você espera que seja. Dê uma olhada onde você atribui o valor a ele, define pontos de interrupção e você precisa descobrir por que esse valor não é transmitido corretamente.

  • O argumento da palavra-chave contém um erro de digitação

    Corrija isso no padrão de url ou no url que você está construindo.

Se estiverem corretos:

  • Depurar o regex

    Você pode usar um site como regexr para testar rapidamente se seu padrão corresponde ao url que você pensa que está criando, copie o padrão de url para o campo regex na parte superior e, em seguida, use a área de texto para incluir quaisquer urls que você acha que estão deve corresponder contra.

    Erros comuns:

    • Correspondência com o .caractere curinga ou qualquer outro caractere regex

      Lembre-se de inserir um \prefixo nos caracteres específicos

    • Correspondendo apenas a caracteres minúsculos / maiúsculos

      Tente usar a-Zou em \wvez de a-zouA-Z

  • Verifique se o padrão que você está combinando está incluído nos padrões experimentados

    Se não estiver aqui, é possível que você tenha esquecido de incluir seu aplicativo na INSTALLED_APPSconfiguração (ou a ordem dos aplicativos INSTALLED_APPSpode precisar ser examinada)

Versão Django

No Django 1.10, a capacidade de reverter uma url por seu caminho python foi removida. O caminho nomeado deve ser usado.


Se você ainda não conseguiu rastrear o problema, sinta-se à vontade para fazer uma nova pergunta que inclua o que você tentou, o que você pesquisou (você pode criar um link para esta questão) e, em seguida, inclua o código relevante para o problema - o url que você está combinando, quaisquer padrões de url relevantes, a parte da mensagem de erro que mostra o que o django tentou combinar e, possivelmente, a INSTALLED_APPSconfiguração, se aplicável.


11
Finalmente, temos uma resposta canônica que podemos fornecer como o alvo dup
e4c5

você pode explicar o caminho nomeado no django 1.10?
sage poudel de

2
Sim, set app_name in the app's urls.py (e.g. app_name = 'my_app') é o ponto
CK

Acho este testador de regex ao vivo mais útil: regex101.com
obotezat

Obrigado por este excelente tutorial no NoReverseMatch! Eu fui capaz de resolver meu problema.
newmachines_xyz

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.