Pregunta

Estoy tratando de 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 no válido o algún error de sintaxis cuando hago algo así (con eso quiero decir el código {%%} dentro de un bucle). Python no tiene {} para significar " alcance " ¿Entonces creo que este podría ser mi problema? ¿Estoy formateando mi código incorrectamente?

Editar: el error exacto es: Etiqueta de bloque no válida: 'embed2'

Edit2: Dado que alguien dijo que lo que estoy haciendo 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 aparece un error: El objeto 'NoneType' no es invocable " en la línea 35 .

¿Fue útil?

Solución

En lugar de usar una asignación de división 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 el html con una función de biblioteca en lugar de hacerlo tú mismo.

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

Otros consejos

Estoy bastante seguro de que las plantillas de Django no son compatibles con eso. Para su operación de reemplazo, buscaría en diferentes filtros.

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

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

Dos formas de lograr lo que estaba intentando:

  • Use un motor de plantillas diferente. Consulte Jinja2 para ver un buen ejemplo que se explica completamente para integrarse con Django.
  • Use una etiqueta de plantilla que le permita hacer expresiones Python. Consulte etiqueta Expr de limodou .

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

No veo por qué obtendría " El objeto NoneType no es invocable " ;. 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á intentando extender 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]

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

Debe rodar su propia etiqueta de plantilla personalizada .

Supongo que la razón principal es imponer buenas prácticas. En mi caso, ya me resulta difícil explicar esas etiquetas de plantillas especiales al diseñador de nuestro equipo. Si fuera Python simple, estoy bastante seguro de que no habríamos elegido Django en absoluto. Creo que también hay un problema de rendimiento, los puntos de referencia de las plantillas de Django son rápidos, mientras que la última vez que revisé genshi fue mucho más lento. Sin embargo, no sé si se debe a Python incrustado libremente.

Debe revisar su enfoque y escribir sus propias plantillas personalizadas (más o menos sinónimos de "ayudantes" en Ruby on Rails), o probar 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á su error, pero al menos es menos JavaScriptesque ;-)

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

Será mejor que te tomes un tiempo leyendo la documentación, que es realmente genial y útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top