繁体   English   中英

显示所有jinja对象属性

[英]Display all jinja object attributes

有没有办法在jinja模板中显示给定对象的所有属性的名称/内容/功能。 这样可以更轻松地调试未按预期运行的模板。

我正在使用hyde框架构建一个网站,这将非常方便,因为我仍在学习jinja和hyde的复杂性。

最初,我曾认为使用attr过滤器会起作用,但这似乎需要一个名称值。 我想不必指定名称以获取对象的所有可用属性。

一些谷歌搜索显示django语法如下所示,但我不熟悉django所以这可能只适用于数据库项目。 长话短说,我想要一个类似于任何名为obj

{% for field, value in obj.get_fields %}
    {{ field }} : {{ value }} </br>
{% endfor %}

最终解决方案

@jayven是对的,我可以创建自己的jinja2过滤器。 不幸的是,使用hyde的稳定版本(0.8.4),这不是一个简单的行为,在pythonpath中有一个过滤器,并在site.yaml文件中设置一个简单的yaml值(有一个拉取请求)。 话虽这么说,我能够搞清楚! 所以以下是我的最终解决方案,最终对调试任何未知属性非常有帮助。

只需创建一个包含以下目录树的本地python包,就可以轻松创建特定于站点的hyde扩展

hyde_ext
    __init__.py
    custom_filters.py

现在创建扩展:

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)

要让hyde知道扩展名,请将hyde_ext.custom_filters.CustomFilterPlugin添加到site.yaml文件的“plugins”列表中。

最后,在一个文件上测试它,你可以将它添加到一些随机页面{{resource|debug_attr}}或以下内容中,以获得下划线属性{{resource|debug_attr(verbose=True)}}

当然,我应该补充一点,在hyde 1.0发布的时候,将来这似乎会变得更加容易。 特别是因为已经有拉动请求等待实现更简单的解决方案。 这是一个学习更多关于如何使用jinja和hyde的好方法!

我想你可以自己实现一个过滤器,例如:

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())

另请参阅文档以获取详细信息: http//jinja.pocoo.org/docs/api/#custom-filters

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM