python - Mostrar todos los atributos del objeto jinja.
jinja2 hyde (1)
Creo que puedes implementar un filtro tú mismo, por ejemplo:
from jinja2 import *
def show_all_attrs(value):
res = []
for k in dir(value):
res.append(''%r %r/n'' % (k, getattr(value, k)))
return ''/n''.join(res)
env = Environment()
env.filters[''show_all_attrs''] = show_all_attrs
# using the filter
tmpl = env.from_string(''''''{{v|show_all_attrs}}'''''')
class Myobj(object):
a = 1
b = 2
print tmpl.render(v=Myobj())
También vea el documento para más detalles: http://jinja.pocoo.org/docs/api/#custom-filters
¿Hay una manera de mostrar el nombre / contenido / funciones de todos los atributos de un objeto dado en una plantilla jinja. Esto facilitaría la depuración de una plantilla que no funciona como se espera.
Estoy construyendo un sitio web utilizando el marco de hyde
y esto sería bastante útil ya que todavía estoy aprendiendo las complejidades de jinja y hyde.
Originalmente, pensé que funcionaría usar el filtro attr
, pero esto parece requerir un valor de nombre. Me gustaría no tener que especificar el nombre para obtener todos los atributos disponibles para el objeto.
Algunas búsquedas en Google mostraron que la sintaxis de django se parece a la siguiente, pero no estoy familiarizado con django, por lo que es posible que esto solo se aplique a los elementos de la base de datos. En pocas palabras, me gustaría un método que funcione como este para cualquier objeto llamado obj
{% for field, value in obj.get_fields %}
{{ field }} : {{ value }} </br>
{% endfor %}
solución final:
@jayven tenía razón, podía crear mi propio filtro jinja2. Desafortunadamente, al usar la versión estable de hyde (0.8.4), esto no es un acto trivial de tener un filtro en Pythonpath y establecer un valor simple de yaml en el archivo site.yaml
(hay una solicitud de extracción para eso). Dicho esto, pude resolverlo! Así que la siguiente es mi solución final que termina siendo muy útil para depurar cualquier atributo desconocido.
Es bastante fácil crear extensiones de hyde específicas del sitio, solo cree un paquete de Python local con el siguiente árbol de directorios
hyde_ext
__init__.py
custom_filters.py
Ahora crea la extensión:
from hyde.plugin import Plugin
from jinja2 import environmentfilter, Environment
debug_attr_fmt = ''''''name: %s
type: %r
value: %r''''''
@environmentfilter
def debug_attr(env, value, verbose=False):
''''''
A jinja2 filter that creates a <pre> block
that lists all the attributes of a given object
inlcuding the value of those attributes and type.
This filter takes an optional variable "verbose",
which prints underscore attributes if set to True.
Verbose printing is off by default.
''''''
begin = "<pre class=''debug''>/n"
end = "/n</pre>"
result = ["{% filter escape %}"]
for attr_name in dir(value):
if not verbose and attr_name[0] == "_":
continue
a = getattr(value, attr_name)
result.append(debug_attr_fmt % (attr_name, type(a), a))
result.append("{% endfilter %} ")
tmpl = Environment().from_string("/n/n".join(result))
return begin + tmpl.render() + end
#return "/n/n".join(result)
# list of custom-filters for jinja2
filters = {
''debug_attr'' : debug_attr
}
class CustomFilterPlugin(Plugin):
''''''
The curstom-filter plugin allows any
filters added to the "filters" dictionary
to be added to hyde
''''''
def __init__(self, site):
super(CustomFilterPlugin, self).__init__(site)
def template_loaded(self,template):
super(CustomFilterPlugin, self).template_loaded(template)
self.template.env.filters.update(filters)
Para informar a Hyde sobre la extensión, agregue hyde_ext.custom_filters.CustomFilterPlugin
a la lista de "complementos" del archivo site.yaml
.
Finalmente, {{resource|debug_attr}}
en un archivo, puede agregarlo a alguna página aleatoria {{resource|debug_attr}}
o lo siguiente para obtener incluso los atributos de subrayado {{resource|debug_attr(verbose=True)}}
Por supuesto, debo agregar, que parece que esto podría volverse mucho más fácil en el futuro cada vez que se lance Hyde 1.0. Sobre todo porque ya hay una solicitud de extracción en espera de implementar una solución más simple. ¡Esta fue una gran manera de aprender un poco más sobre cómo usar jinja y hyde!