template - Versión 1.5 de Django: ''url'' requiere un primer argumento no vacío. La sintaxis cambió en Django 1.5
django views (6)
Empecé a utilizar la versión 1.5 de Django y tuve un problema con mi código anterior:
<a href="{% url auto.views.viewpost post.slug %}"><h3>{{post.title}}</h3></a>
Error: ''url'' requiere un primer argumento no vacío. La sintaxis cambió en Django 1.5, vea los documentos. Documentos:
Una característica obsoleta que vale la pena observar es el cambio a la etiqueta URL de "nuevo estilo". Antes de Django 1.3, la sintaxis como {% url myview%} se interpretaba incorrectamente (Django consideraba que "myview" era un nombre literal de una vista, no una variable de plantilla llamada myview). Django 1.3 y posteriores introdujeron la sintaxis {% load url from future%} para traer el comportamiento corregido donde myview se veía como una variable.
El resultado de esto es que si no usa {% load url from future%} en sus plantillas, deberá cambiar las etiquetas como {% url myview%} a {% url "myview"%}. Si usaba {% load url from future%}, simplemente puede eliminar esa línea en Django 1.5
Luego probé: <a href=“{% url ''auto.views.view_post'' post.slug %}”><h3>{{post.title}}</h3></a>
pero obtuve el error Invertir para '' auto.views.view_post ''con argumentos'' ('''',) ''y argumentos de palabras clave'' {} ''no encontrados. :( ¿Qué estoy haciendo mal? ¡Thx!
En primer lugar, fue correcto utilizar comillas simples para el nombre de la vista, es decir, ''auto.views.view_post''
.
Ahora, elimine temporalmente la etiqueta url
y verifique que {{ post }}
y {{ post.slug }}
den los valores que espera. Los arguments ''('''',)''
mensaje de error arguments ''('''',)''
sugieren que el problema es post.slug
.
Obtuve un error de "SECUENCIA DE BYTE ILEGAL" de sed con la mayoría de estas recetas, que pude solucionar haciendo esto primero:
LANG=C
Sin embargo, estas recetas generaron toneladas de falsos positivos en mi proyecto, y ya teníamos una combinación de nombres de url que se cotizaban de forma simple, comillas dobles o sin comillas. Fue un desastre. Resultó que el enfoque más limpio era simplemente buscar en el directorio de plantillas con mi editor (Sublime) en modo regex para:
/{/%/ url/ [^'']
/{/%/ url/ [^"]
(encuentre todas las instancias que no fueron citadas) y examínelas visualmente. Eso resultó ser más rápido y más limpio que tratar de automatizarlo y luego limpiar el desastre después.
Para excluir la carpeta de .git y para evitar el error, MacOS agregó comillas vacías a la opción -i ''''. Ejemplo:
find . -path ''*/.git*'' -prune -o -type f -print0 | xargs -0 sed -i '''' ''s/ url /([^" >][^ >]*/)/ url "/1"/g''
Pero me gusta este enfoque (MacOS):
grep ''{% url'' -lrZ . | xargs -0 sed -i '''' ''s/ url /([^" >][^ >]*/)/ url "/1"/g''
Realmente odio hacer toda esta basura a mano, así que escribí un script sed para hacerlo por mí. Primero asegúrese de tener una copia de seguridad, luego ejecútela en su directorio de plantillas:
find . -type f -print0 | xargs -0 sed -i ''s/{% url /([^" >][^ >]*/)/{% url "/1"/g''
Pasará por todos sus archivos de plantilla y reemplace esto:
{% url something.else foo bar %}
con este
{% url "something.else" foo bar %}
Tenga cuidado, era un poco flojo con esto, podría romperse en algunos constructos. Sin embargo, todavía será más fácil buscar errores en una diferencia que hacerlo a mano.
Si está usando Mac OS necesitará pasar -e
find . -type f -print0 | xargs -0 sed -i -e ''s/ url /([^" >][^ >]*/)/ url "/1"/g''
es posible que también deba hacer regexp-replace "/{% url "([/w:]+)"
for "/{% url ''$1''
para ver errores de sintaxis como <a href="{% url "foo:bar" %}">baz</a>