显示所有jinja对象属性

2024-09-28 21:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在jinja模板中是否有显示给定对象的所有属性的名称/内容/函数的方法。这将使调试不按预期工作的模板更加容易。

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

最初,我以为使用attr过滤器是可行的,但这似乎需要一个名称值。我不想为了获得对象的所有可用属性而指定名称。

一些google搜索显示的django语法如下,但我不熟悉django,所以这可能只适用于数据库项。长话短说,我想要一个对任何名为obj的对象都能像这样工作的方法

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

最终解决方案:

@jayven是对的,我可以创建自己的jinja2过滤器。不幸的是,使用稳定版本的hyde(0.8.4),在pythonpath中设置一个过滤器并在site.yaml文件中设置一个简单的yaml值(有一个pull请求)并不是一件小事。尽管如此,我还是能搞清楚!因此,下面是我的最终解决方案,它对调试任何未知属性都非常有帮助。

创建特定于站点的hyde扩展非常简单,只需使用以下目录树创建一个本地python包

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_ext.custom_filters.CustomFilterPlugin添加到site.yaml文件的“插件”列表中。

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

当然,我要补充的是,在将来海德1.0发布后,这似乎会变得容易得多。尤其是因为已经有一个请求等待实现一个更简单的解决方案。这是一个很好的方式来学习更多关于如何使用金贾和海德虽然!


Tags: tonamedebugselfjinja2verbose属性value
1条回答
网友
1楼 · 发布于 2024-09-28 21:31:07

我认为您可以自己实现一个过滤器,例如:

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

相关问题 更多 >