urls template syntaxerror sintaxis significa que invalid example errores comunes python django templates django-templates

template - Error de sintaxis cada vez que pongo el código de Python dentro de una plantilla de Django



invalid sintaxis python (5)

Intento hacer lo siguiente en mi plantilla de Django:

{% for embed in embeds %} {% embed2 = embed.replace("&lt;", "<") %} {{embed2}}<br /> {% endfor %}

Sin embargo, siempre obtengo un bloque inválido o algún error de sintaxis cuando hago algo así (con eso quiero decir {%%} código dentro de un bucle). Python no tiene {} para significar "alcance", así que creo que este podría ser mi problema. ¿Estoy formateando mi código incorrectamente?

Editar: el error exacto es: Invalid block tag: ''embed2''

Edit2: Como alguien dijo que lo que hago no es compatible con las plantillas de Django, reescribí el código, poniendo la lógica en la vista. Ahora tengo:

embed_list = [] for embed in embeds: embed_list[len(embed_list):] = [embed.replace("&lt;", "<")] #this is line 35 return render_to_response("scanvideos.html", { "embed_list" :embed_list })

Sin embargo, ahora recibo un error: ''NoneType'' object is not callable" on line 35 .


En lugar de usar una asignación de sector para hacer crecer una lista

embed_list[len(embed_list):] = [foo]

probablemente deberías hacer

embed_list.append(foo)

Pero realmente deberías intentar eliminar html con una función de biblioteca en lugar de hacerlo tú mismo.

Ese error de NoneType suena como embed.replace es None en algún momento, lo cual solo tiene sentido si su lista no es una lista de cadenas; es posible que desee verificarlo dos veces con algunas afirmaciones o algo similar.


Estoy bastante seguro de que las plantillas de Django no son compatibles. Para su operación de reemplazo examinaría diferentes filtros.

Deberías tratar de mantener tanta lógica como puedas en tus vistas y no en las plantillas.


No veo por qué obtendrías "El objeto NoneType no se puede llamar". Eso debería significar que en algún lugar de la línea hay una expresión como "foo (...)", y significa que foo es None.

Por cierto: estás tratando de extender el embed_list, y es más fácil hacerlo así:

embed_list = [] for embed in embeds: embed_list.append(embed.replace("&lt;", "<")) #this is line 35 return render_to_response("scanvideos.html", {"embed_list":embed_list})

y aún más fácil de usar una lista de comprensión:

embed_list = [embed.replace("&lt;", "<") for embed in embeds]


El lenguaje de plantilla de Django se obstaculiza deliberadamente. Cuando es utilizado por diseñadores que no son de programación, definitivamente es una buena cosa, pero hay veces en las que necesitas hacer un poco de programación. (No, no quiero discutir sobre eso. Esto ha aparecido varias veces en django-users y django-dev.)

Dos formas de lograr lo que estabas intentando:

  • Use un motor de plantilla diferente. Consulte Jinja2 para obtener un buen ejemplo que se explica completamente para la integración con Django.
  • Use una etiqueta de plantilla que le permita hacer expresiones de Python. Ver la etiqueta Expr de limodou .

He usado la etiqueta expr en varios lugares y me ha hecho la vida mucho más fácil. Mi próximo gran sitio de Django usará jinja2.


Las plantillas de Django usan su propia sintaxis, no como Kid o Genshi .

Tienes que rodar tu propia etiqueta de plantilla personalizada .

Supongo que la razón principal es la aplicación de buenas prácticas. En mi caso, ya me cuesta explicar las plantillas de etiquetas especiales al diseñador de nuestro equipo. Si fuera simple Python, estoy bastante seguro de que no hubiéramos elegido a Django en absoluto. Creo que también hay un problema de rendimiento, las pruebas de patrones de Django son rápidas, mientras que la última vez que revisé genshi fue mucho más lento. Sin embargo, no sé si se debe a Python libremente incorporado.

O necesita revisar su enfoque y escribir sus propias plantillas personalizadas (más o menos sinónimos para "ayudantes" en Ruby on Rails), o pruebe con otro motor de plantillas.

Para su edición, hay una mejor sintaxis en Python:

embed_list.append(embed.replace("&lt;", "<"))

No sé si solucionará tu error, pero al menos es menos JavaScriptesque ;-)

Edición 2: Django escapa automáticamente a todas las variables. Puede aplicar HTML sin procesar con el filtro | safe: {{embed|safe}} .

Es mejor que se tome un tiempo para leer la documentación, que es realmente genial y útil.