すべてのjinjaオブジェクトの属性を表示する 質問する

すべてのjinjaオブジェクトの属性を表示する 質問する

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 にフィルターを配置し、ファイルに単純な yaml 値を設定するという簡単な作業ではありませんsite.yaml(そのためのプル リクエストがあります)。そうは言っても、私はそれを理解することができました! 以下は、不明な属性をデバッグするのに非常に役立つ最終的な解決策です。

サイト固有の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 に拡張機能を知らせるには、ファイルhyde_ext.custom_filters.CustomFilterPluginの「プラグイン」リストに追加しますsite.yaml

最後に、ファイルでテストします。これをランダムなページ{{resource|debug_attr}}または次のページに追加して、アンダースコア属性を取得できます。{{resource|debug_attr(verbose=True)}}

もちろん、将来 hyde 1.0 がリリースされれば、この作業はもっと簡単になるかもしれないと付け加えておきます。特に、よりシンプルなソリューションを実装するためのプル リクエストがすでにあるのでなおさらです。しかし、これは jinja と hyde の使い方をもう少し学ぶには素晴らしい方法でした。

ベストアンサー1

たとえば、次のように自分でフィルターを実装できると思います。

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

詳細についてはドキュメントも参照してください:カスタムフィルター

おすすめ記事