Invertido para ‘*’ con argumentos ‘()’ y argumentos de palabra clave ‘{}’ no encontrados

Se ha capturado una excepción al renderizar:

Reverso de ‘products.views.’filter_by_led’ con argumentos ‘()’ y argumentos de palabras clave ‘{}’ no encontrados.

Pude importar con éxito products.views.filter_by_led desde el shell y funcionó, por lo que la ruta debería ser correcta.

Aquí está el urls.py:

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

Aquí es donde se está generando el error:

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

Que no puedo entender porque esto funciona bien desde el mismo archivo:

 {% url products.views.lcd_screen_size screen_size=50 %} 

Aquí está la definición de la función:

 def filter_by_led(request): 

No entiendo por qué Django pensaría que la función no sería capaz de encontrar el Reverso para esa función.

Borre todos los *.pyc y reinicié Apache.

¿Qué estoy haciendo mal?

Hay 3 cosas que se me ocurren en la cabeza:

  1. Sólo se utilizan las URL con nombre , es más robusto y fácil de mantener de todos modos
  2. Intente usar django.core.urlresolvers.reverse en la línea de comandos para un (posiblemente) mejor error

     >>> from django.core.urlresolvers import reverse >>> reverse('products.views.filter_by_led') 
  3. Compruebe si tiene más de una URL que apunte a esa vista

Las llamadas de Shell a la reversa (como se mencionó anteriormente) son muy buenas para depurar estos problemas, pero existen dos condiciones críticas:

  • debe proporcionar argumentos que coincidan con los argumentos que necesite la vista,
  • estos argumentos deben coincidir con los patrones de expresión regular.

Sí, es lógico. Sí, también es confuso porque revertir solo lanzará la excepción y no le dará más pistas.

Un ejemplo de patrón de URL:

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

Y luego lo que pasa en 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. 

No funciona porque no proporcioné argumentos.

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

Ahora funcionó, pero …

 >>> 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. 

Ahora no funcionó porque url_id no coincide con la expresión regular (cadena numérica esperada, numérica esperada).

Puede utilizar la inversión con argumentos posicionales y argumentos de palabras clave. La syntax es:

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

En lo que respecta a la etiqueta de la plantilla url , hay algo gracioso al respecto. La documentación de Django da un ejemplo de cómo usar el nombre de vista citado:

{% url ‘news.views.year_archive’ yearvar%}

Así que lo usé de manera similar en mi plantilla HTML:

{% url ‘show_cookies’ hostname = u.hostname url_id = u.pk%}

Pero esto no funcionó para mí. Pero el mensaje de excepción me dio una pista de lo que podría estar mal, tenga en cuenta las comillas dobles alrededor del nombre de la vista:

Reverso de ” show_cookies ” con argumentos …

Comenzó a funcionar cuando quité las citas:

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

Y esto es confuso.

Necesita comillas simples alrededor del nombre de la vista

 {% url 'viewname' %} 

en lugar de

 {% url viewname %} 

Tuve un problema similar y la solución estaba en el uso correcto del carácter ‘$’ (final de cadena):

Mi url.py principal se veía así (note el carácter $):

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

y mi url.py para mi aplicación card_purchases dijo:

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

Utilicé el ‘$’ dos veces. Así que un simple cambio funcionó:

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

¡Note el cambio en la segunda url! Mi url.py para mi aplicación card_purchases se parece a esto:

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

Aparte de esto, puedo confirmar que las citas en torno a las URL con nombre son cruciales.

En caso de que ayude a alguien, tuve un problema similar y el error se debió a dos razones:

  1. No usar el espacio de nombres de la aplicación antes del nombre de url

     {% url 'app_name:url_name' %} 
  2. Faltan comillas simples alrededor del nombre de la url (como lo señaló aquí Charlie)

 {% url 'polls:create' poll.id %} 

No creo que necesites la barra diagonal en la entrada de la URL. Es decir, pon esto en su lugar:

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

Esto es asumiendo que tiene barras inclinadas habilitadas, que es el valor predeterminado.