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