Ich habe eine HTML / jinja2-Vorlage, mit der ich Daten in Form einer Tabelle anzeige.

Die Daten für die Tabelle können auf unterschiedliche Weise vorliegen, und ich möchte, dass die Vorlage beide Typen mit if-Anweisungen verarbeiten kann. Die Funktion type (x) in Python funktioniert in dieser Sprache nicht.

  1. eine Reihe von Wörterbüchern (Liste der Wörterbücher)

  2. ein Array von Arrays (Liste von Listen)

Ein Teil der Vorlage:

{% block page_content %}
<input type="text" id="search" placeholder="Type to search">
<table id="table" class="table">
<tr style="white-space:nowrap;">
    {% for h in headers %}
    {% if h is string %}
    <th>{{h}}</th>
    {% else %}
    <th>{{h[1]}}</th>
    {% endif %}
    {% endfor %}
</tr>
{%if data is "TYPE CHECK HERE"}
{% for row in data %}
{% if row != {} %} #ALTERNATIVELY, COULD DO A TYPE CHECK HERE
<tr style="white-space:nowrap;{% if row['bad'] %}background-color:rgba(255, 0, 0, 0.09);{% endif %}">
    {% for h in headers %}
    <td style="white-space:nowrap;">{{ row[h[0]] }}</td>
    {% endfor %}
</tr>
{% endif %}
{% endfor %}

{% endblock%}

TL: DR Was sind die unterscheidbaren Typen in jinja2? Wie überprüfe ich den Typ einer Variablen?

1
Josh Sharkey 17 Apr. 2018 im 23:51

3 Antworten

Beste Antwort

Es ist besser, so viel wie Ihren Logikcode auf der Python-Seite zu belassen, bevor Sie Jinja rendern.

Übertragen Sie also Ihre Daten auf der Python-Seite in eine Liste von Headern und eine verschachtelte Liste als Ihre Daten:

render_template('test.html', 
                headers=['name', 'age',], 
                rows=[{'color': 'red', 'data': ['john', 84]},
                      {'color': 'green', 'data':['jacob', 45]}]

Html:

 <table>
  <thead>
    <tr>
    {% for item in header %}
      <th> {{ item }} </th>
    {% endfor %}
    </tr>
  </thead>

  <tbody>
  {% for row in rows %}
    <tr style="colour: {{ row['color'] }}">
    {% for cell in row['data'] %}
      <td>{{cell}}</td>
    {% endfor %}
    </tr>
  {% endfor %}
  </tbody>
</table>

Ich habe beim Lernen auch ähnliche Ansätze wie Sie ausprobiert, aber am Ende habe ich festgestellt, dass dies am besten funktioniert, da Sie dadurch die größtmögliche Flexibilität in Bezug auf Ihre Daten erhalten und die Bearbeitung von Daten auf der Python-Seite oft recht einfach ist. Also keine wirkliche Antwort, nur allgemeine Ratschläge.

2
Joost 17 Apr. 2018 im 21:42

Sie könnten diesen Link suchen, dort einige beschreiben gültige Typen zum Vergleichen. Sie können beispielsweise überprüfen, ob es sich um ein Diktat handelt. Sie versuchen:

{% if type({'a':1,'b':2}) is mapping %}
     print "Oh Yes!!"
{% else %}
    print "Oh No!!!"
{% endif %}

Sie können alles verschachteln, was Sie brauchen, aber der richtige Weg ist hier, komplexe Logik auf den Controller zu migrieren.

PD: Dieses Beispiel stammt aus hier. Vielen Dank an @ sean-vieira

0
Juan Castaño 17 Apr. 2018 im 21:57
  1. my_var ist eine Liste
my_var = []
my_var.insert(0, 'list')
  1. my_var ist str
my_var = '111'
  1. in jinja2 zu unterscheiden
{% if my_var[0] == 'list' %}
list: 
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}

{% else%}
str: {{ my_var }}
{% endif %}
0
admin 5 Sept. 2019 im 01:47