2009-12-03 9 views
55

detectó una excepción al intentar mostrar:Inversa de '*' con los argumentos '()' y argumentos de palabra clave '{}' no se ha encontrado

Reverse for 'products.views.'filter_by_led' with arguments '()' and keyword arguments '{}' not found.

yo era capaz de importar correctamente products.views.filter_by_led de la cáscara y funcionó tan el camino debe ser correcto

Aquí es el urls.py:

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

Aquí es donde se genera 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í es la definición de función: 0

def filter_by_led(request): 

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

Eliminé todos los archivos *.pyc y reinicié Apache.

¿Qué estoy haciendo mal?

+0

¿puede mostrar definiciones de lcd_screen_size y filter_by_led url? –

+1

ya que la marcha atrás funcionó en el caparazón ... probablemente sea otra cosa la que causa el problema. Obtuve algunos errores inversos bastante extraños, parece que CUALQUIER definición de URL incorrecta en cualquier lugar de tu proyecto puede estropear todo:/ – Jiaaro

Respuesta

51

Hay 3 cosas que puedo pensar en la parte superior de mi cabeza:

  1. Sólo utiliza named urls, es más robusto y fácil de mantener todos modos
  2. Trate de usar django.core.urlresolvers.reverse en la línea de comando para una (posiblemente) mejor de error

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

+0

inversa parece funcionar bien desde el shell: >>> de django.core .urlresolvers importar inversa >>> inversa ('products.views.filter_by_led') '/ comentarios/led /' – BryanWheelock

+1

también trataron de usar nombres de direcciones URL y me dieron el mismo tipo de error: detectó una excepción al intentar mostrar: inversa de 'ledtvfilter' con argumentos '()' y argumentos de palabras clave '{}' no encontrados. – BryanWheelock

+0

si el revés trabajó en el shell entonces eso probablemente no es lo que está causando el error – Jiaaro

0

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

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

Esto es suponiendo que haya habilitado trailing slashes, que es el valor predeterminado.

+1

no debería importar, pero si quieres una barra inclinada en la url, debería estar allí (Todos mis archivos 'urls.py' tienen la barra al final) – Jiaaro

35

Shell llama a inversa (como se mencionó anteriormente) son muy buenos para depurar estos problemas, pero hay dos condiciones fundamentales:

  • que necesidad argumentos de suministro que coincida con lo que los argumentos de las necesidades de visión,
  • estos argumentos deben coincidir con los patrones de expresiones regulares.

sí, es lógico. Sí, también es confuso porque inversa sólo habrá emitir la excepción y no le dará ninguna pista más.

Un ejemplo de patrón de URL:

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

Y luego lo que sucede en la 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 proporciona parámetro.

>>> 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ó debido a URL_ID no coincide con la expresión regular (numérico, cadena suministrada esperado).

Puede utilizar inversa con ambos argumentos posicionales y los argumentos de palabras clave. La sintaxis es la siguiente:

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

Como se trata de la etiqueta de plantilla url, hay algo gracioso al respecto. Django documentation da ejemplo del uso de nombre de vista citado:

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

Así que lo usaron 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 equivocado - en cuenta las comillas simples alrededor de la vista Nombre:

Reverse for ''show_cookies'' with arguments...

Comenzó a trabajar cuando quitado las comillas:

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

Y es confuso.

+1

Utilicé una url (r '^ candidate- verifymobile/$, views.VerifyMobile.as_view(), name = 'verify-mobile'), pero aun así cuando uso reverse da el mismo error en este caso, no tengo ningún argumento de palabra clave en la url. –

+0

en situaciones donde a veces tendré un argumento y otras veces no, ¿necesito crear dos funciones de vista separadas y dos URL separadas en mi ** urls.py **? usando su ejemplo imagine que a veces 'u.pk' es un número otras veces que es None. pero en su plantilla está usando '{% url 'show_cookies' url_id = u.pk%}'. intenté agregar '{% if u.pk == None%} mostrar mensaje de error {% else%} {% url 'show_cookies' url_id = u.pk%} {% endif%}' pero sigo recibiendo una excepción NoReverseMatch. – Deven

11

Usted necesita comillas simples alrededor del nombre de la vista

{% url 'viewname' %} 

en lugar de

{% url viewname %} 
+0

esto fue útil! – Anupam

4

tuve un problema similar y la solución estaba en el uso correcto de la '$' (al final de su -string) carácter:

Mi url.py principal era la siguiente (nótese 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') 
] 

He utilizado el '$' dos veces. Así que un simple cambio funcionó:

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

notar el cambio en la segunda url! Mi urlpy para mi card_purchases aplicación es el siguiente:

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

Aparte de esto, puedo confirmar que entre comillas el nombre URLs son cruciales!

+0

Muchas gracias. Pasé una hora depurando el problema. Tu solución fue justamente lo que me estaba perdiendo. – v01d

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

En caso de que ayuda a alguien, tuve un problema similar y el error era debido a dos razones:

  1. La no utilización del espacio de nombres de la aplicación antes de que el nombre de la URL

    {% url 'app_name:url_name' %} 
    
  2. Faltan comillas simples alrededor del nombre de la url (como se señala here por Charlie)

Cuestiones relacionadas