Jinja python टेम्प्लेट में कॉमा सीमांकित सूची कैसे आउटपुट करें?


179

यदि मेरे पास usersकहने की सूची है ["Sam", "Bob", "Joe"], तो मैं कुछ ऐसा करना चाहता हूँ जहाँ मैं अपनी jinja टेम्पलेट फ़ाइल में आउटपुट कर सकता हूँ:

{% for user in userlist %}
    <a href="/profile/{{ user }}/">{{ user }}</a>
    {% if !loop.last %}
        , 
    {% endif %}
{% endfor %}   

मैं आउटपुट टेम्पलेट बनाना चाहता हूं:

Sam, Bob, Joe

मैंने उपरोक्त कोड को यह जांचने की कोशिश की कि क्या यह लूप के अंतिम पुनरावृत्ति पर था और यदि नहीं, तो कॉमा नहीं डालें, लेकिन यह काम नहीं करता है। मैं यह कैसे करु?


जिंज, पायथन की तरह, !एक नकारात्मक संचालक के रूप में उपयोग नहीं करता है । "नहीं" वर्तनी है "नहीं"।
Wooble

जवाबों:


306

आप चाहते हैं कि आपका ifचेक:

{% if not loop.last %}
    ,
{% endif %}

ध्यान दें कि आप If Expression का उपयोग करके भी कोड को छोटा कर सकते हैं :

{{ "," if not loop.last }}

2
यह कमाल है, विशेष रूप से html में लूप के अंत में
सिनक्स

7
बस फी, आपको इसे अपनी सेटिंग्स के आधार पर एक / अन्य बनाने की आवश्यकता हो सकती है। और जानकारी। यहाँ पाया जा सकता है: github.com/pallets/jinja/issues/710
पॉल कैलाब्रो

1
या कुछ मामले हैं{{ "," if not forloop.last }}
obotezat

5
मैं दूसरे को जोड़ने के बारे में टिप्पणी करता हूं। यह मेरे लिए काम करता है{{ "," if not loop.last else "" }}
आहोंग

197

आप इसके लिए निर्मित "ज्वाइन" फिल्टर ( http://jinja.pocoo.org/docs/templates/#join) का भी उपयोग कर सकते हैं :

{{ users|join(', ') }}

1
हालांकि यह एक csv बनाने के लिए काम करता है, ऊपर उसका उदाहरण देखकर, इसका उपयोग आसपास के एंकर के साथ नहीं किया जा सकता है।
26

यह दृष्टिकोण भागने से भी अच्छा काम नहीं करता है: [[{{[a + ’’, doesn't b ’] | join (('’, ’’}}) ’] [’ a & # 39; & # 39; , & # 39; बी ']
३४:३४

6
यह पहली कोशिश होनी चाहिए। यदि यह वांछित के रूप में काम नहीं करता है, तो एक और समाधान का प्रयास करें, लेकिन यह निश्चित रूप से सबसे साफ है।
यरद

यह एक अनुगामी अल्पविराम देता है, मैं इससे कैसे छुटकारा पाऊं?
जोनाथन

आपके पास संभवतः एक अनुगामी खाली तत्व है। अगर आपको तीन तत्व मिल गए हैं तो एक्स के साथ जुड़ने पर आपको aXbXc मिलेगा:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens

61

और http://jinja.pocoo.org/docs/dev/templates/#joinerjoiner से उपयोग कर रहे हैं

{% set comma = joiner(",") %}
{% for user in userlist %}
    {{ comma() }}<a href="/profile/{{ user }}/">{{ user }}</a>
{% endfor %}  

यह इस सटीक उद्देश्य के लिए बनाया गया है। आम तौर पर शामिल होने या forloop.last का एक चेक किसी एक सूची के लिए पर्याप्त होगा, लेकिन कई समूहों के लिए यह उपयोगी है।

आप इसका उपयोग क्यों करेंगे इस पर एक अधिक जटिल उदाहरण।

{% set pipe = joiner("|") %}
{% if categories %} {{ pipe() }}
    Categories: {{ categories|join(", ") }}
{% endif %}
{% if author %} {{ pipe() }}
    Author: {{ author() }}
{% endif %}
{% if can_edit %} {{ pipe() }}
    <a href="?action=edit">Edit</a>
{% endif %}

1
यह वास्तव में मेरे लिए बहुत अच्छी तरह से काम करता था, एक अनुगामी अल्पविराम छोड़कर। इसके लिए धन्यवाद!
डैनियल आंद्रेई मिनकॉ

7

निम्न कोड ने jinja2 का उपयोग करके काम किया, फ़िल्टर Uli Martens को python3.5 शेल में सुझाया गया:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.