61 votes

Inverse pour '*' avec les arguments '()' et les arguments de mots clés '{}' non trouvés

Pris une exception lors du rendu:
Reverse for 'products.views.'filter_by_led' with arguments '()' and keyword arguments '{}' not found.

J'ai pu réussir à importer products.views.filter_by_led de la coquille et il a travaillé de sorte que le chemin d'accès doit être correcte.

Ici, c'est le urls.py:
(r'^led-tv/$', filter_by_led ),

C'est là que l'erreur est généré:
href="{% url products.views.filter_by_led %}">

Que je ne peux pas comprendre parce que cela fonctionne bien à partir du même fichier:
{% url products.views.lcd_screen_size screen_size=50 %}

Voici la définition de la fonction:
def filter_by_led(request):

Je ne comprends pas pourquoi Django pense que la fonction ne serait pas en mesure de trouver l'Inverse de cette fonction.

J'ai supprimé tous les *.pyc les fichiers et redémarré Apache.

Ce que je fais mal?

56voto

Jiaaro Points 14379

Il y a 3 choses auxquelles je peux penser de façon spontanée:

  1. Juste utilisé des URL nommées , il est plus robuste et maintenable de toute façon
  2. Essayez d’utiliser django.core.urlresolvers.reverse en ligne de commande pour une (éventuellement) meilleure erreur

     >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
     
  3. Vérifiez si vous avez plus d'une URL qui pointe vers cette vue

37voto

kravietz Points 908

Shell appels à l' inverse (comme mentionné ci-dessus) sont très bons pour déboguer ces problèmes, mais il y a deux conditions critiques:

  • vous devez fournir des arguments qui correspond à ce que les arguments le point de vue des besoins,
  • ces arguments doivent correspondre regexp modèles.

Oui, c'est logique. Oui, il est aussi source de confusion en raison inverse ne jeter l'exception et ne pas vous donner de conseils.

Un exemple de modèle d'URL:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),

Et puis ce qui se passe dans le shell:

>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.

Il ne fonctionne pas parce que j'ai fourni aucun argument.

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'

Maintenant, il a travaillé, mais...

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.

Maintenant, il ne fonctionne pas parce que *url_id* ne correspond pas à l'expression régulière (prévu numérique, chaîne fournie).

Vous pouvez utiliser l' inverse avec à la fois des arguments de position et les arguments mots-clefs. La syntaxe est la suivante:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)

Comme il s'agit de l' url de la balise de modèle, il y a de drôle de chose à son sujet. Django documentation donne l'exemple de l'utilisation de cité le nom de la vue:

{% url de l'actualité.les vues.year_archive' yearvar %}

Je l'ai donc utilisé de la même manière dans mon gabarit HTML:

{% url "show_cookies' hostname=u.nom d'hôte url_id=u.pk %}

Mais cela n'a pas fonctionné pour moi. Mais le message de l'exception m'a donné une idée de ce que pourrait être fausse - note, la double guillemets simples autour de le nom de la vue:

Inverse pour "show_cookies" avec des arguments...

Il a commencé à travailler quand j'ai enlevé les guillemets:

{% url show_cookies hostname=u.nom d'hôte url_id=u.pk %}

Et cela est source de confusion.

0voto

Chase Seibert Points 7609

Je ne pense pas que vous ayez besoin de la barre oblique finale dans l'entrée de l'URL. C'est-à-dire, mettez ceci à la place:

 (r'^led-tv$', filter_by_led ),
 

En supposant que les barres obliques de fin soient activées, ce qui est la valeur par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X