2017-11-07 5 views
0

Ich habe eine Liste der Themen:Jinja2: Vergleichen Sie Elemente in einer Liste in Artikeln in einer anderen Liste

list1 = [topic1, topic2, topic3, topic4, topic5, topic6] 

Ich möchte eine andere Liste mit dieser Liste überprüfen:

list2 = [topic2, topic4, topic6] 

so etwas wie diese :

{% if list2.items in list1 %} 

wo jedes Element von list2 für in list1 überprüft wird. Wenn alle oder einige der Elemente aus Liste2 in Liste 1 enthalten sind, ist es wahr. Ich dachte, das wäre einfach, aber ich kann nichts hilfreiches finden.

Voll Beispiel:

{% set list1 = [topic2, topic4, topic6] %} 

{% for post in posts %} 

    {% set list2 = [topic1, topic2, topic3, topic4, topic5, topic6] %} 

    {% for topic in list2 %} 
     {% if topic in list1 %} 

      {# output of post list based on conditions #} 

     {% endif %} 
    {% endfor %} 
{% endfor %} 

** I in einem CMS mit out-Server Seite Zugang arbeite, so habe ich nur die Template-Sprache mit zu arbeiten.

+1

Sie können das Listenverständnis verwenden: '[Element für Element in Liste1, wenn Element in Liste2]' – ryugie

Antwort

1

Ich kenne keine Jinja2 built-in tests, die dies tun können, aber es ist einfach, Ihre eigenen hinzuzufügen.

Angenommen, Sie haben eine Vorlage wie diese in einer Datei template.j2 genannt:

Is l1 in l2: {% if l1 is subsetof(l2) %}yes{% else %}no{% endif %} 

Sie können dann (im selben Verzeichnis in diesem Beispiel), einen Python-Skript, das diese Überprüfung fügt hinzu:

import jinja2 


def subsetof(s1, s2): 
    return set(s1).issubset(set(s2)) 


loader = jinja2.FileSystemLoader(".") 
env = jinja2.Environment(loader=loader) 
env.tests["subsetof"] = subsetof 

template = env.get_template("template.j2") 
print(template.render(l1=[1, 2], l2=[1, 2, 3])) 

Beachten Sie, dass das erste Argument der Testfunktion vor der is-Klausel in der Vorlage übergeben wird, während das zweite Argument innerhalb der Klammern übergeben wird.

Dies sollte drucken:

Is l1 in l2: yes 

Werfen Sie einen Blick auf, wie Sie benutzerdefinierte Tests here

+0

Gute Lösungen! Ich verwende ein cms, das mir nur eine Template-Sprache gibt, mit der ich arbeiten kann, aber ich kann nicht mit den Python-Skripten arbeiten. – JSum

+0

Ah, in diesem Fall bin ich mir nicht sicher, ob Sie einen benutzerdefinierten Jinja2-Filter verwenden können. Wahrscheinlich müssen Sie die Elemente in der Vorlage manuell durchlaufen. Dies würde jedoch nicht so gut aussehen, und die Templating-Logik kann nur so weit gehen. – bow

0

Erstellen Sie einfach einen benutzerdefinierten Filter definieren:

def intersect(a, b): 
    return set(a).intersection(b) 

env.filters['intersect'] = intersect 

Und dann ist es wie alle anderen Filter verwenden :

{% if list1 | intersect(list2) %} 
     hello 
    {% else %} 
     world 
    {% endif%} 

Dies ist, wie es in Ansible getan wird.

Verwandte Themen