我想在我的数据库中将一个简单的查询显示为一个HTML表.但我在Django的数据管理模板或一般逻辑中遗漏了一些东西.

首先,我要创建一个这样的模型:

class Book(models.Model):
    title = models.CharField(max_length=128, unique =True)
    quantity = models.IntegerField(default=1)

然后创建一个包含查询的列名和查询对象的上下文的视图,例如:

def books(request):
    context = {"rows":Book.objects.all(),"fields" : Book._meta.get_fields()}
    return render(request,"blog/books.html",context)

最后,我try 迭代模板中的查询值,以便可以将它们放入一个HTML表中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Our Books</title>
</head>
<body>

    <table border="1">
        <thead>
            <tr>
                {% for field in fields %}
                    <th>{{ field.verbose_name }}</th>
                {% endfor %}
            </tr>
        </thead>
        <tbody>
            {% for row in rows %}
                <tr>
                    {% for field in fields %}
                        <td>{{ 行[字段] }}</td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </tbody>
    </table>

</body>
</html>

添加表头可以很好地工作,但此部分不起作用:

{% for row in rows %}
    <tr>
         {% for field in fields %}
             <td>{{ 行[字段] }}</td>
         {% endfor %}
    </tr>
{% endfor %}

我try 了不同的东西,没有任何运气:

  1. 行[字段]
  2. 行[field.Verose_name]
  3. Row.field
  4. {{row.dict.get(field.Verbose_name)}}
  5. 还有更多

我应该如何继续呢?我不想在我的模板中硬编码列的名称,我想迭代它们,这样它就可以与任何表一起工作.

推荐答案

Django的模板语言not支持订阅(即x[y]),这是为了防止人们在模板中编写business logic.可以使用Jinja作为模板语言,但这并不是必需的,而且在某种程度上会适得其反,这恰恰是为了防止在模板中编写业务逻辑.

但是,我们可以在视图中"准备"数据,方法是:

def books(request):
    fields = Book._meta.get_fields()
    context = {
        'rows': [
            [getattr(book, field.name) for field in fields]
            for book in Book.objects.all()
        ],
        'fields': fields,
    }
    return render(request, 'blog/books.html', context)

然后使用以下命令进行渲染:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Our Books</title>
</head>
<body>

    <table border="1">
        <thead>
            <tr>
                {% for field in fields %}
                    <th>{{ field.verbose_name }}</th>
                {% endfor %}
            </tr>
        </thead>
        <tbody>
            {% for row in rows %}
                <tr>
                    {% for cell in row %}
                        <td>{{ cell }}</td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </tbody>
    </table>

</body>
</html>

Note:要以一种有效的方式呈现表格,看一下django-tables2 [GitHub]可能是值得的.

Python-3.x相关问答推荐

根据其他数据框架的列顺序从数据框架中进行 Select

TypeError:&Quot;Value&Quot;参数必须是标量、Dict或Series,但您传递了&Quot;Index&Quot;

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

visual studio代码窗口中未激活虚拟环境11

PyQt5 中耦合滑块和拨号小部件.解决结果不一致的问题

如何获取实例化 `types.GenericAlias` 的下标类?

拆分列表的元素并将拆分后的元素包含到列表中

如何转置和 Pandas DataFrame 并命名新列?

在 Python 中实现 COM 接口

根据另一个数据帧中的位置从主数据帧中提取子序列

如何通过 GitLab V4 api 列出 gitlab 项目中的所有项目变量

运行 pip install -r requirements.txt 时出错

列表中的重复数字与列表理解

UnicodeDecodeError:utf-8编解码器无法解码位置 1 的字节 0x8b:无效的起始字节,同时读取Pandas中的 csv 文件

如何使用pandas python获取数据框中每列的最大长度

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

Python configparser 不会接受没有值的键

使用 Tensorflow 2.0 在 MNIST 上实现自定义神经网络?

Python 的 unittest 和 unittest2 模块有什么区别?

三个参数的reduce函数