web-dev-qa-db-fra.com

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

Pris une exception lors du rendu: 

Inverse pour 'products.views.'filter_by_led' avec les arguments '()' et arguments de mot clé '{}' non trouvé.

J'ai réussi à importer products.views.filter_by_led depuis le shell et cela a fonctionné, le chemin doit donc être correct.

Voici l'urls.py: 

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

C'est là que l'erreur est générée: 

href="{% url products.views.filter_by_led %}">

Ce que je ne comprends pas car cela fonctionne très bien dans le 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 penserait que la fonction ne pourrait pas trouver l'inverse pour cette fonction.

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

Qu'est-ce que je fais mal?

58
BryanWheelock

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

  1. Juste utilisé nommé urls , il est plus robuste et maintenable de toute façon
  2. Essayez d’utiliser Django.core.urlresolvers.reverse sur la 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

53
Jiaaro

Les appels de shell à inverser (comme mentionné ci-dessus) sont très utiles pour résoudre ces problèmes, mais il existe deux conditions critiques:

  • vous devez fournir des arguments qui correspondent à tous les arguments dont la vue a besoin,
  • ces arguments doivent correspondre aux modèles regexp.

Oui, c'est logique Oui, c'est également déroutant car reverse ne lève que l'exception et ne vous donnera aucune indication supplémentaire.

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 ensuite ce qui se passe dans 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.

Cela ne fonctionne pas car je n'ai fourni aucun argument.

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

Maintenant cela a fonctionné, 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, cela ne fonctionnait pas parce que url_id ne correspondait pas à l'expression rationnelle (attendue numérique, chaîne fournie).

Vous pouvez utiliser reverse avec des arguments de position et des arguments de mots clés. La syntaxe est la suivante:

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

En ce qui concerne la balise de modèle url, il y a quelque chose de drôle à ce sujet. Django documentation donne un exemple d'utilisation du nom de vue cité:

{% url 'news.views.year_archive' yearvar%}

Je l'ai donc utilisé de manière similaire dans mon modèle HTML:

{% url 'show_cookies' hostname = u.hostname url_id = u.pk%}

Mais cela n'a pas fonctionné pour moi. Mais le message d'exception m'a donné une idée de ce qui pouvait être erroné - notez les guillemets simples autour du nom de la vue:

Inverse pour '' show_cookies '' avec des arguments ...

Cela a commencé à fonctionner lorsque j'ai supprimé les guillemets:

{% url show_cookies nom_hôte = u.nom_hôte url_id = u.pk%}

Et ceci est déroutant.

36
kravietz

Vous avez besoin de guillemets simples autour du nom de la vue

{% url 'viewname' %}

au lieu de

{% url viewname %}
11
Charlie

J'ai eu un problème similaire et la solution consistait à utiliser correctement le caractère '$' (fin de chaîne):

Mon URL principale.py ressemblait à ceci (remarquez le caractère $):

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^$', include('card_purchase.urls' )),
]

et mon url.py pour mon application card_purchases a déclaré:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

J'ai utilisé le '$' deux fois. Donc un simple changement a fonctionné:

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^cp/', include('card_purchase.urls' )),
]

Notez le changement dans la deuxième URL! Mon url.py pour mon application card_purchases ressemble à ceci:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

En dehors de cela, je peux confirmer que les citations autour des URL nommées sont cruciales!

4
Hendrik F

Au cas où cela aiderait quelqu'un, j'avais un problème similaire et l'erreur était due à deux raisons:

  1. Ne pas utiliser l'espace de noms de l'application avant le nom de l'URL

    {% url 'app_name:url_name' %}
    
  2. Citations simples manquantes autour du nom de l'URL (comme indiqué ici par Charlie)

2
Anupam

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 ),

Cela suppose que vous avez des barres obliques de fin activé, ce qui est la valeur par défaut.

0
Chase Seibert
{% url 'polls:create' poll.id %}
0
Raghu