2009-10-16 8 views
4

Folks, j'obtiens une erreur NoReverseMatch pour un appel d'URL particulier.Comment faire pour déboguer les erreurs Django NoReverseMatch?

Je voudrais savoir: y a-t-il de bons outils pour les déboguer en général? Par exemple, un moyen de répertorier les URL enregistrées?

Mon exemple particulier:

Modèle:

<a href= 
"{% url django.contrib.auth.views.redirect_to_login blarg %}">log in</a> 

Erreur:

NoReverseMatch: Reverse for 
'settings.django.contrib.auth.views.redirect_to_login' 
with arguments '('[[ UNDEFINED VARIABLE ]]',)' 
and keyword arguments '{}' not found. 

J'utilise Google App Engine avec appenginepatch, si Django est modifié.

Répondre

3

Dans ce cas particulier où l'inversion de l'URL utilise le chemin complet vers la fonction de vue, la chose la plus simple à faire est simplement de regarder la fonction de vue. Dans Django-1.1 cela ressemble à:

def redirect_to_login(next, login_url=None, 
          redirect_field_name=REDIRECT_FIELD_NAME): 
    "Redirects the user to the login page, passing the given 'next' page" 
    if not login_url: 
     login_url = settings.LOGIN_URL 
    return HttpResponseRedirect('%s?%s=%s' % (login_url, 
               urlquote(redirect_field_name), 
               urlquote(next))) 

Cette fonction ne prend même pas un objet de requête, de sorte que son vraiment même pas une vue correcte, et il est même pas enregistré dans django/contrib/auth/urls.py. Cela signifie qu'il est probablement destiné uniquement à être utilisé comme une fonction d'assistance dans d'autres vues.

Dans tous les cas, en fonction de votre exemple particulier, ce que vous vouliez sans doute à faire était d'utiliser l'url ancienne connexion simple comme ceci:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}"> 
    log in 
</a> 

Aussi, je crois que si vous définissez TEMPLATE_DEBUG = True dans vos paramètres, vous obtiendra une liste de tous les modèles d'URL vérifiés par django avant de lancer l'erreur.

+0

Merci! Bien décrit. C'est essentiellement ce que j'ai fini par faire, en utilisant auth.REDIRECT_FIELD_NAME à la place de "next". Cependant, TEMPLATE_DEBUG = True n'affichait aucune information supplémentaire sur les modèles d'URL, donc je laisse cette question ouverte. Étant donné que j'utilise Google App Engine avec le correctif du moteur d'application, Django est assez corrigé, donc je voulais voir les modèles d'URL enregistrés, pas seulement le deviner. – dfrankow

+0

Je sais que j'ai vu cette page de débogage s'exécuter dans google app engine, mais j'utilisais simplement le django intégré et non le correctif du moteur de l'application. – pcardune

+0

Ouais, si vous définissez DEBUG = True, vous voyez ce tableau de motifs quelques fois et pas d'autres. En ce moment, j'oublie pourquoi ça ne se présente pas toujours. – dfrankow

Questions connexes