2016-11-16 93 views
1

我有jinja2模板,它以'keys:value'的形式從yaml獲取數據變量。如何檢查鍵變量是否存在,並防止在jinja2模板中鍵+值爲空的打印行

問題是當我運行jinja2模板時,它會打印出具有空'值'的行。

我該怎麼做,以便它不會打印空行。否則,它將顯示爲無。

例如;

-Template

set first {{ABC}} 
set second {{DEF}} 
set third {{GHI}} 

-yaml數據

ABC : data1 
DEF : 
GHI : data3 

如果我運行它,它都註明;

set first data1 
set second None 
set third data3 

我不希望它是這樣。我想要它打印;

set first data1 
set third data3 

如何做到這一點?通過防止行被添加,如果變量未定義。

感謝,

更新腳本: -

TEMPLATE_FILE = { 'trial_1': 'trial.tcl' } 
    for f,s in TEMPLATE_FILE.items(): 

    template = templateEnv.get_template(s) 

    with open('tmp.yaml', 'rb') as stream: 
     try: 
      yaml_input_data = yaml.load(stream) 
     except yaml.YAMLError as exc: 
      pass 
    print(yaml_input_data) 

    for k, v in yaml_input_data.items(): 
     if v is None: 
      yaml_input_data.pop(k) 
    print(yaml_input_data) 

    with open(f, 'w') as outfile:  
     outfile.writelines(template.render(yaml_input_data)) 
    print '\nWrote',f 

更新Jinja2的模板

{% for k, v in yaml_input_data.iteritems() %} 
    {# use k, v #} 
set first {{ABC}} 
set second {{DEF}} 
set third {{GHI}} 
{% endfor %} 
+0

您沒有使用變量'k'和'​​v'。這可能會幫助您瞭解事情的工作原理 - http:// stackoverflow。com/questions/19141073/rendering-a-python-dict-in-jinja2-werkzeug 我建議學習python如何與Jinja交互以及Jinja如何工作的基本知識。這是一個很好的例子,使用Flask,但概念可以概括 - https://realpython.com/blog/python/primer-on-jinja-templating/ – Aditya

回答

0

可以使用Jinja2 conditional blocks

{% if ABC %} 
set first {{ABC}} 
{% endif %} 
{% if DEF %} 
set second {{DEF}} 
{% endif %} 
{% if GHI %} 
set third {{GHI}} 
{% endif %} 

這將驗證每個值是否存在。如果它不存在,則跳過該行,並且寫入給定的{%if%}{%endif%}塊內的內容。

0

您可以使用Jinja的{% if variable %}塊 - @ Jalepeno112可以很好地回答這個問題。但是,如果可能的話,我會建議將YAML解析爲像Python中的字典這樣的數據結構,然後使用Jinja模板中的數據結構。

這將使您有機會清除python中的數據,然後僅發送存在的值。

我在這裏做了一個假設,YAML是通過python傳遞給Jinja的,因爲您還爲該問題添加了python標記。

編輯1: 有多種方法可以實現這一點,但添加一個簡單的例子來說明我的意思。

with open('tmp.yaml', 'r') as stream: 
    try: 
     yaml_input_data = yaml.load(stream) 
    except yaml.YAMLError as exc: 
     # handle error 
     pass 

print(yaml_input_data) 
# {'ABC': 'data1', 'DEF': None, 'GHI': 'data3'} 

for k, v in yaml_input_data.items(): 
    if v is None: 
     yaml_input_data.pop(k) 

# Now pass yaml_input_data to the Jinja template 
print(yaml_input_data) 
#{'ABC': 'data1', 'GHI': 'data3'} 

EDIT2: 你可以改變神社模板,這樣的事情?

{% for k, v in yaml_input_data.iteritems() %} 
    {# use k, v #} 
{% endfor %} 
+0

是的,我使用Python以及通過導入jinja2和YAML。那麼,我該怎麼做? –

+0

@ k-rd在anwer – Aditya

+0

中增加了一個我想建議編輯爲1的例子,它仍然在模板中顯示與未定義的'key'對應的變量。我怎樣才能得到輸出,以便它只打印定義的鍵。例如:設置第一個數據1 設置第三個數據3 –

相關問題