Создание HTML-таблицы в форме Jinja DICT списка - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть длинный словарь данных, который выглядит так,

('Item', 8): Components_data(base_quantity=63.0, items_data={'830927': [1.0, 14.851799999999999], '831103': [0.37170000000000003, 0.6972720300000002]}, price_labor=374.21824212, total=389.76731415)}

Ключ - это кортеж, а мои значения находятся в именованном кортеже с 3 целыми числами и 1 словарем, где ключи - это строки, а значения - целые числа.

Я хочу использовать эти значения для динамического построения таблицы Html с использованием jinja: результат, который я хочу, должен выглядеть следующим образом: enter image description here

Где строки компонентов, Кол-во и Единица цены генерируются автоматически в соответствии со значениями items_data в поле Componnents_data.

вот что я пробовал до сих пор с дзиндзя:

<table class="table table-bordered">
                    <thead>
                        <tr>
                            <th>Level</th>
                            <th>Item</th>
                            <th>Component</th>
                            <th>Qty</th>
                            <th>Price Unit</th>
                            <th>Price Total</th>
                            <th>Total</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for item, components_data in prices.items() %}
                        <tr>
                            <td rowspan="3">{{item[1]}}</td>
                            <td rowspan="3">{{item[0]}}</td>
                        </tr>
                        {% for sub_components, sub_comp_dat in components_data.items_data.items()%}
                        <td>{{sub_components}}</td>
                        <td>{{ sub_comp_dat[0] }}</td>
                        <td>{{ sub_comp_dat[1] }}</td>
                        <td>{{ components_data.price_labor }}</td>
                        <td>{{ components_data.total }}</td>
                        </tr>
                        {% endfor %} {% endfor %}
                        <tr>
                            <td colspan="3" id='total-label'>Total</td>
                            <td colspan="4" id='total-value' text-align='right'>july</td>
                        </tr>
                    </tbody>
                </table>

И результаты выглядят так: enter image description here

Я перепробовал все советы, которые знаю, но не могу получить ожидаемых результатов, любая помощь приветствуется. Спасибо

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Еще раз спасибо @ Alessandro.Vegna ответ за интуицию использования оператора if else.

Это может быть достигнуто в соответствии с этим ответом с использованием пространств имен: в jinja 2.0

вот ответ:

<tbody>
                        {% for item, components_data in prices.items() %}
                        <tr>
                            <td rowspan="3">{{item[1]}}</td>
                            <td rowspan="3">{{item[0]}}</td>
                        </tr>
                            {% set time = namespace(first=False) %}
                            {% for sub_components, sub_comp_dat in components_data.items_data.items() %}
                             <tr>
                            <td>{{sub_components}}</td>
                            <td>{{ sub_comp_dat[0] }}</td>
                            <td>{{ sub_comp_dat[1] }}</td>
                            {% if not time.first %}
                                {% set time.first = True %}
                            <td rowspan="3">{{ components_data.price_labor }}</td>
                            <td rowspan="3">{{ components_data.total }}</td>
                        {% endif %}
                        </tr>
                        {% endfor %} {% endfor %}
                        <tr>
                            <td colspan="3" id='total-label'>Total</td>
                            <td colspan="4" id='total-value' text-align='right'>july</td>
                        </tr>
                    </tbody>
0 голосов
/ 26 апреля 2018

Я не знаю синтаксиса дзиндзя, но вы легко можете достичь своей цели, сохраняя логическое значение, чтобы проверить, была ли сумма уже записана.

например:.

 {% for item, components_data in prices.items() %}
    <tr>
        <td rowspan="3">{{item[1]}}</td>
        <td rowspan="3">{{item[0]}}</td>
    </tr>
    //set the flag to false
    isFirstTime = false
    {% for sub_components, sub_comp_dat in components_data.items_data.items()%}
        <td>{{sub_components}}</td>
        <td>{{ sub_comp_dat[0] }}</td>
        <td>{{ sub_comp_dat[1] }}</td>
        //show the price only the first time
        if( isFortTime)
        {
            isFistTime = true;
            <td rowspan="3">{{ components_data.price_labor }}</td>
            <td rowspan="3">{{ components_data.total }}</td>
        }
        </tr>
    {% endfor %} 
{% endfor %}

Опять же, это неправильный синтаксис, но вы можете достичь этого без проблем.


Документация:

Назначение переменной в шаблоне

Если заявление

...