python - una - Invertir para ''*'' con argumentos ''()'' y argumentos de palabras clave ''{}'' no encontrados
palabras claves de python (7)
Capturó una excepción mientras procesaba:
Inversa para ''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ó para que la ruta sea correcta.
Aquí está el urls.py:
(r''^led-tv/$'', filter_by_led ),
Aquí es donde se genera el error:
href="{% url products.views.filter_by_led %}">
Lo cual 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 podría encontrar el Reverse para esa función.
Eliminé todos los *.pyc
y reinicié Apache.
¿Qué estoy haciendo mal?
En caso de que ayude a alguien, tuve un problema similar y el error se debió a dos razones:
No usar el espacio de nombres de la aplicación antes del nombre de la url
{% url ''app_name:url_name'' %}
Faltan comillas simples alrededor del nombre de la url (como lo señala Charlie)
Hay 3 cosas que puedo pensar en la parte superior de mi cabeza:
- Solo usé URLs con nombre , es más robusto y fácil de mantener
Intenta usar
django.core.urlresolvers.reverse
en la línea de comando para un (posiblemente) mejor error>>> from django.core.urlresolvers import reverse >>> reverse(''products.views.filter_by_led'')
Comprueba si tienes más de una url que apunta a esa vista
Las llamadas de shell para invertir (como se mencionó anteriormente) son muy buenas para solucionar 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 expresiones regulares.
Sí, es lógico Sí, también es confuso porque reverse arrojará la excepción y no le dará más pistas.
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, ¿qué ocurre en el caparazón?
>>> 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 coincidía con la expresión regular (cadena numérica esperada y suministrada).
Puede usar el reverso con argumentos posicionales y argumentos de palabra clave. La sintaxis es:
reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)
En lo que respecta a la etiqueta de plantilla de la url , hay algo gracioso al respecto. La documentation Django da un ejemplo del uso del nombre de vista entrecomillado:
{% url ''news.views.year_archive'' yearvar%}
Así que lo usé de manera similar en mi plantilla HTML:
{% url ''show_cookies'' nombre de host = 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 simples dobles alrededor del nombre de la vista:
Invierta para '''' show_cookies '''' con argumentos ...
Empezó a funcionar cuando eliminé las comillas:
{% 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 %}
No creo que necesite la barra final en la entrada de la URL. Es decir, pon esto en su lugar:
(r''^led-tv$'', filter_by_led ),
Esto supone que tiene barras diagonales habilitadas, que es la predeterminada.
Tuve un problema similar y la solución estaba en el uso correcto del carácter ''$'' (final de la cadena):
Mi url.py principal se veía así (observe el caracter $):
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'')
]
Usé el ''$'' dos veces. Entonces un simple cambio funcionó:
urlpatterns = [
url(r''^admin/'', include(admin.site.urls )),
url(r''^cp/'', include(''card_purchase.urls'' )),
]
¡Observe el cambio en la segunda url! Mi url.py para mi aplicación card_purchases tiene este aspecto:
urlpatterns = [
url(r''^$'', views.index, name=''index''),
url(r''^purchase/$'', views.purchase_detail, name=''purchase'')
]
¡Además de esto, puedo confirmar que las citas alrededor de las URL nombradas son cruciales!
{% url ''polls:create'' poll.id %}