python - español - django windows
Filtros de plantilla Django, etiquetas, etiquetas_completa e inclusión_tags (1)
Los filtros de plantillas pueden operar en cualquier objeto (y como máximo dos a la vez). Solo son funciones que toman uno o dos argumentos. p.ej
# filter implementation
@filter
def myfilter(arg1, arg2):
....
# usage in template
{{ arg1|myfilter:arg2 }}
Están limitados porque no pueden acceder al contexto de la plantilla y solo pueden aceptar un número limitado de argumentos.
Caso de uso : desea modificar una de las variables en el contexto ligeramente antes de imprimirla.
Las etiquetas de plantilla pueden cambiar la forma en que se analiza el resto de la plantilla y tener acceso a cualquier cosa en el contexto en el que se utilizan. Son muy poderosos. Por ejemplo, escribí una etiqueta de plantilla que subclases {% extends %}
y permite que una plantilla extienda diferentes plantillas según el Usuario actual.
Puede reconocer fácilmente las etiquetas de plantilla cuando se usan, porque están rodeadas por {%
y %}
.
Caso de uso : desea realizar alguna lógica que requiera código Python y acceso al contexto de la plantilla.
Las etiquetas de inclusión siguen siendo etiquetas de plantilla, pero Django proporciona algunos ayudantes (es decir, el decorador @inclusion_tag
) para facilitar la escritura de etiquetas de plantilla de este tipo.
Caso de uso : desea renderizar una plantilla en otra. Por ejemplo, puede tener un anuncio en su sitio que desee utilizar en diferentes lugares. Es posible que no pueda utilizar la herencia de plantillas para lograr lo que desea, por lo que en lugar de copiar / pegar el HTML para el anuncio varias veces, escribiría una etiqueta de inclusión.
La razón por la que usaría una etiqueta de inclusión sobre la etiqueta de plantilla existente {% include %}
, es posible que desee renderizar la plantilla con un contexto diferente al que está. Quizás necesite hacer algunas consultas de base de datos, para Seleccione el anuncio correcto para mostrar. Esto no es posible con {% include %}
.
Las etiquetas simples como las etiquetas de inclusión, las etiquetas simples siguen siendo etiquetas de plantilla pero tienen una funcionalidad limitada y están escritas de manera simplificada. Le permiten escribir una etiqueta de plantilla que acepta cualquier número de argumentos (por ejemplo, {% mytag "some str" arg2 arg3 %}
etc.) y requieren que solo implemente una función que pueda aceptar estos argumentos (y opcionalmente una variable de context
para dar). Usted accede al contexto de la plantilla.
Esencialmente, son una actualización de los filtros de plantilla, porque en lugar de aceptar solo 1 o 2 argumentos, puedes aceptar tantos como quieras (y también puedes acceder al contexto de la plantilla).
Esta es una pregunta más general acerca de las distinciones entre estos cuatro tipos diferentes de etiquetas django. Acabo de leer la página de documentación en las etiquetas de la plantilla: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
Pero me resulta difícil saber cuándo debo usar una variación sobre otra. Por ejemplo, ¿qué puede hacer una etiqueta de plantilla que un simple_tag no puede? ¿Se limita el filtro a manipular solo cadenas y es por eso que la documentación dice que las etiquetas de plantilla son más poderosas porque pueden "hacer cualquier cosa"?
Aquí está mi percepción de las distinciones:
- Filtros de plantilla: solo operan en cadenas y cadenas de retorno. ¿No tienes acceso a los modelos?
- etiquetas de plantilla: acceso a cualquier cosa a la que se pueda acceder en una vista, compilado en nodos con una función de representación específica (parece que la única ventaja es que puede agregar variables al contexto).
- simple_tags: toma cadenas y variables de plantilla y devuelve una cadena, se le pasa el valor de la variable de plantilla en lugar de la propia variable (¿cuándo querría la variable por sí misma sobre el valor?)
- Etiquetas de inclusión: le permiten renderizar plantillas extra arbitrarias
¿Puede alguien dar un ejemplo que describa cuándo querría usar uno de estos sobre otro?
Gracias.