19

jinja テンプレートで特定のオブジェクトのすべての属性の名前/コンテンツ/機能を表示する方法はありますか。これにより、期待どおりに動作しないテンプレートを簡単にデバッグできます。

フレームワークを使用して Web サイトを構築してい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 値を設定するという単純な行為ではありません (そのためのプルリクエストがあります)。と言う事で、やっと理解できました!したがって、以下は私の最終的な解決策であり、未知の属性をデバッグするのに非常に役立ちます。

サイト固有の 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 がリリースされるたびに、これは将来的により簡単になるように思われることを付け加えておく必要があります。特に、よりシンプルなソリューションの実装を待っているプル リクエストがすでに存在するためです。これは、ジンジャとハイドの使い方をもう少し学ぶのに最適な方法でした!

4

1 に答える 1

12

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

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

于 2012-11-18T03:43:14.257 に答える