2

誰かが私の問題に光を当ててくれることを願っています。私は HTML/CSS/JavaScript 開発の初心者です。

請求書を作成するために、JinJa HTML テンプレートに入力する Python スクリプトがあります。この請求書には、約 50 の項目があります。請求書の作成 ヘッダー、本文 (請求明細行)、およびフッターを含む 1 つの HTML ページがあります。しかし、私が達成したいのは、ページ番号付きの複数ページの請求書を作成することです。たとえば、各ページには最大 15 行の項目のみを含める必要があり、ヘッダー セクション、本文、フッターを再度作成し、項目が完了するまで続けます。ページ番号で複数のページを作成できますが、各ページの内容は同じで、これを実現する方法が思いつきません。

私のpythonコード:

from jinja2 import Environment, FileSystemLoader
import os
root = os.path.dirname(os.path.abspath(__file__))
templates_dir = os.path.join(root, 'templates')
env = Environment( loader = FileSystemLoader(templates_dir) )
template = env.get_template('invoice.html')
invoice_id = "BI-09994"

filename = os.path.join(root, 'html', invoice_id + '.html')
with open(filename, 'w') as fh:
fh.write(template.render(
    lines    = [("101211036", 'Volvo D13 FH12 Oil Filter', 3, "1000.00" , "3000.00"), ("101211037", 
'Volvo2', 1, "20.00", "20.00"), ("101211038", 'Volvo3', 1, "3000.00", "3000.00"),("101211036", 
'Volvo1', 3, "1000.00" , "3000.00"), ("101211037", 'Volvo2', 1, "20.00", "20.00"), ("101211038", 
'Volvo3', 1, "3000.00", "3000.00"),("101211036", 'Volvo1', 3, "1000.00" , "3000.00"), ("101211037", 
'Volvo2', 1, "20.00", "20.00"), ("101211038", 'Volvo3', 1, "3000.00", "3000.00"),("101211036", 
'Volvo1', 3, "1000.00" , "3000.00"), ("101211037", 'Volvo2', 1, "20.00", "20.00"), ("101211038", 
'Volvo3', 1, "3000.00", "3000.00"),("101211036", 'Volvo1', 3, "1000.00" , "3000.00"), ("101211037", 
'Volvo2', 1, "20.00", "20.00"), ("101211038", 'Volvo3', 1, "3000.00", "3000.00"),("101211036", 
'Volvo1', 3, "1000.00" , "3000.00"), ("101211037", 'Volvo2', 1, "20.00", "20.00"), ("101211038", 
'Volvo3', 1, "3000.00", "3000.00")],
     pages = [(1),(2),(3)],
    invoice_id = invoice_id,
    credted_date = "2020/04/22",
    due_date = "2020/04/29",
    comp_name = "BI - Applications",
    comp_addr1 = "305 Kerkenberg Avenue",
    comp_addr2 = "Villieria, Pretoria",
    comp_addr3 = "South - Africa, 0187",
    client_name = "Tecfinity (PTY) LTD",
    client_addr1 = "8 Osborn Lane",
    client_addr2 = "East Gate, Johannesburg",
    client_addr3 = "South - Africa, 0189",
    po_no = "Derick Mulder",
    ps_no = "BPS98007",
))

私のジンジャ テンプレート コード:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>{{invoice_id}}</title>

<style>
.invoice-box {
    max-width: 800px;
    margin: auto;
    padding: 30px;
    border: 1px solid #eee;
    box-shadow: 0 0 10px rgba(0, 0, 0, .15);
    font-size: 16px;
    line-height: 24px;
    font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
    color: #555;

}

.invoice-box table {
    width: 100%;
    line-height: inherit;
    text-align: left;

}

.invoice-box table td {
    padding: 2px;
    vertical-align: middle;

}

.invoice-box table tr td:nth-child(2) {
    text-align: right;

}

.invoice-box table tr.top table td {
    padding-bottom: 20px;

}

.invoice-box table tr.top table td.title {
    font-size: 45px;
    line-height: 45px;
    color: #333;
}

.invoice-box table tr.information table td {
    padding-bottom: 40px;

}

.invoice-box table tr.heading td {
    background: #eee;
    border-bottom: 1px solid #ddd;
    font-weight: bold;
}

.invoice-box table tr.details td {
    padding-bottom: 20px;
}

.invoice-box table tr.item td{
    border-bottom: 1px solid #eee;

}

.invoice-box table tr.item.last td {
    border-bottom: none;
}

.invoice-box table tr.total td:nth-child(5) {
    border-top: 2px solid #eee;
    font-weight: bold;
    text-align: right;
}

@media only screen and (max-width: 600px) {
    .invoice-box table tr.top table td {
        width: 100%;
        display: block;
        text-align: center;
    }

    .invoice-box table tr.information table td {
        width: 100%;
        display: block;
        text-align: center;
    }
}

/** RTL **/
.rtl {
    direction: rtl;
    font-family: Tahoma, 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
}

.rtl table {
    text-align: right;
    table-layout:fixed;
}

.rtl table tr td:nth-child(2) {
    text-align: left;
}
</style>
</head>
{% for page in pages %}
<body>
<div class="invoice-box">
    <table cellpadding="0" cellspacing="0">
        <tr class="top">
            <td colspan="5">
                <table>
                    <tr>
                        <td class="title">
                            <img src="https://www.bi-applications.co.za/wp-content/uploads/2020/04/Embliam-only.png" style="width:100%; max-width:150px;">
                        </td>

                        <td>

                            Invoice #: {{invoice_id}}<br>
                            Created: {{credted_date}}<br>
                            Due: {{due_date}}<br>
                            P/O: {{po_no}}<br>
                            P/S: {{ps_no}}
                        </td>
                    </tr>
                </table>
            </td>
        </tr>

        <tr class="information">
            <td colspan="5">
                <table>
                    <tr>
                        <td>
                            {{comp_name}}<br>
                            {{comp_addr1}}<br>
                            {{comp_addr2}}<br>
                            {{comp_addr3}}
                        </td>

                        <td>
                            {{client_name}}<br>
                            {{client_addr1}}<br>
                            {{client_addr2}}<br>
                            {{client_addr3}}
                        </td>
                    </tr>
                </table>
            </td>
        </tr>

        <tr class="top">
            <td colspan="5">
                <table>
                    <tr>
                        <td class="title" align="center">
                            TAX INVOICE
                        </td>

                    </tr>
                </table>
            </td>
        </tr>

        <tr class="heading">
            <td>
                Part No
            </td>

            <td style="text-align:left">
                Description
            </td>

            <td style="text-align:right">   
                Qty
            </td>

            <td style="text-align:right">
                Unit
            </td>

            <td style="text-align:right">
                Price
            </td>

        </tr>

        {% for stk in lines %}
        <tr class="item">
            <td >
                {{stk[0]}}
            </td>
            <td style="text-align:left; word-break:break-all;" >
                {{stk[1]}}
            </td>
            <td style="text-align:right" >
                {{stk[2]}}
            </td>
            <td style="text-align:right">
                {{stk[3]}}
            </td>
            <td style="text-align:right">
                {{stk[4]}}
            </td>

        </tr>
             {% endfor %}


        <tr class="total">
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td colspan="4">
               Total: R 38 500.00
            </td>
        </tr>

    </table>
        {{ page[0] }}
        Page : {{page}}
</div>

</body>

{% endfor %}
</html>

JavaScriptはこれで私を助けてくれますか? たとえば、読み込み時にヘッダーを動的に作成し、ページあたりの最大行数に達するまでループ内の項目の入力を開始し、フッター セクション、ヘッダー セクションを作成して、本文を続けます。

上記が理にかなっていることを願っています

4

0 に答える 0