urls template django url

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>