【问题标题】:How to format template with django?如何用django格式化模板?
【发布时间】:2022-12-17 13:39:28
【问题描述】:

我有一个 Django 应用程序。我尝试格式化一些数据。

所以我有这个方法:


from __future__ import print_function

import locale
import re
from fileinput import filename
from itertools import zip_longest
from locale import LC_NUMERIC, atof

import pandas as pd
from tabulate import tabulate

class FilterText:

def show_extracted_data_from_file(self):
       

        verdi_total_fruit = [12, 13, 14]
        verdi_fruit_name = ["watermeloenen", "appels", "winterpeen"]
        verdi_cost = [123, 55, 124, 88, 123, 123]

        regexes = [verdi_total_fruit, verdi_fruit_name, verdi_cost]
        matches = [(regex) for regex in regexes]       
       
        return tabulate(
            zip_longest(*matches),  # type: ignore
            headers=[
                "aantal fruit",
                "naam fruit",
                "kosten fruit",
            ],
        )

观点:

def test(request):
    filter_text = FilterText()
    content = ""
    content = filter_text.show_extracted_data_from_file()
    context = {"content": content}
    return render(request, "main/test.html", context)

模板


<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Create a Profile</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <link rel="stylesheet" type="text/css" href="{% static 'main/css/custom-style.css' %}" />
        <link rel="stylesheet" type="text/css" href="{% static 'main/css/bootstrap.css' %}" />
    </head>

    <body>
        <div class="container center">
            <span class="form-inline" role="form">
                <div class="inline-div">
                    <form class="form-inline" action="/controlepunt140" method="POST" enctype="multipart/form-data">

                        <div class="d-grid gap-3">
                            <div class="form-group">                                

                            </div>
                            <div class="form-outline">
                                <div class="form-group">
                                    <div class="wishlist">
                                        {{content}}
                                    </div>
                                </div>
                            </div>
                        </div>
                </div>
            </span>
            <span class="form-inline" role="form">
                <div class="inline-div">
                    <div class="d-grid gap-3">
                        <div class="form-group">

                           
                        </div>
                    </div>
                </div>
            </span>

            </form>
        </div>
    </body>
</html>

产生这个结果:

 aantal fruit naam fruit kosten fruit -------------- ------------- -------------- 12 watermeloenen 123 13 appels 55 14 winterpeen 124 88 123 123        

但如您所见,它是一个水平输出。

但我希望每个项目都在彼此之下。它看起来像:

6  Watermeloenen 577,50
75 Watermeloenen  69,30
9  watermeloenen  46,20

一个 问题:如何格式化模板?

如果我这样做:

 print(tabulate(
            zip_longest(*matches),  # type: ignore
            headers=[
                "aantal fruit",
                "naam fruit",
                "kosten fruit",
            ],
        ))

它看起来是正确的:

 aantal fruit  naam fruit     kosten fruit
--------------  -------------  --------------
            16  Watermeloenen  123,20
           360  Watermeloenen  2.772,00
             6  Watermeloenen  46,20
            75  Watermeloenen  577,50
             9  Watermeloenen  69,30
           688  Appels         3.488,16
            22  Sinaasappels   137,50
            80  Sinaasappels   500,00
           160  Sinaasappels   1.000,00
           320  Sinaasappels   2.000,00
           160  Sinaasappels   1.000,00
            61  Sinaasappels   381,25

但不在模板中

所以这:

  return tabulate(
            zip_longest(*matches),  # type: ignore
            headers=[
                "aantal fruit",
                "naam fruit",
                "kosten fruit",
            ],tablefmt="html"
        )

那么输出是这样的:

<table> <thead> <tr><th style="text-align: right;"> aantal fruit</th><th>naam fruit </th><th style="text-align: right;"> kosten fruit</th></tr> </thead> <tbody> <tr><td style="text-align: right;"> 12</td><td>watermeloenen</td><td style="text-align: right;"> 123</td></tr> <tr><td style="text-align: right;"> 13</td><td>appels </td><td style="text-align: right;"> 55</td></tr> <tr><td style="text-align: right;"> 14</td><td>winterpeen </td><td style="text-align: right;"> 124</td></tr> <tr><td style="text-align: right;"> </td><td> </td><td style="text-align: right;"> 88</td></tr> <tr><td style="text-align: right;"> </td><td> </td><td style="text-align: right;"> 123</td></tr> <tr><td style="text-align: right;"> </td><td> </td><td style="text-align: right;"> 123</td></tr> </tbody> </table> 

【问题讨论】:

  • content 的输出全部在一个表格行 (&lt;tr&gt;) 中。
  • @dgw。是的,但是如何改进呢?
  • @mightycodeNewton 这取决于您使用的包提供了tabulate 功能,但我首先要尝试的是将forendfor 部分移到&lt;tr&gt; 标签之外。
  • @巫毒汉堡。我正在使用制表包。
  • @巫毒汉堡。我已经做到了。但随后它将显示为一个长的垂直字符串。

标签: python html django


【解决方案1】:

tabulate包需要第三个参数tablefmt才能输出HTML,所以需要在headers之后将tablefmt="html"传递给tabulate()函数。

    return tabulate(
        zip_longest(*matches),  # type: ignore
        headers=[
            "aantal fruit",
            "naam fruit",
            "kosten fruit",
        ],
        tablefmt="html",
    )

您需要使用 django.utils.safestring 中的 mark_safe() 包装此输出。

请注意,这会生成一个包含所有标签的完整 HTML 表格,因此您可以简单地输出 content 而不是遍历表格行:

<div class="wishlist">
    {{ content }}
</div>

此时值得将 content 重命名为更合适的名称,例如 table

【讨论】:

  • @voodoo-burger.I 做了一个可重现的例子。但这不起作用。
  • @mightycodeNewton 你需要比“它不起作用”更具体一点。你现在看到什么输出?
  • @voodoo-burger。但是你可以测试一下。我做了一个示例代码片段。
  • @voodoo-burger.I 做到了。但是你会看到字面上的html代码
  • @mightycodeNewton 我更新了答案,您需要将mark_safe() 应用于tabulate() 函数的输出。
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 2012-07-01
  • 2013-03-05
  • 1970-01-01
  • 2019-09-20
  • 2019-10-18
  • 2020-05-24
  • 2016-03-23
相关资源
最近更新 更多