【问题标题】:Loop over fields in a database row in Django template循环遍历 Django 模板中数据库行中的字段
【发布时间】:2016-01-18 20:22:47
【问题描述】:

我是 Django(1.8,Python 3)的新手,我正在尝试用它构建一个小网站。

[为了简单起见,我把我的情况改成一个虚构的书店]

我想要完成的是:假设我有一个模型(如果您愿意,可以使用数据库表),其中包含一堆书籍数据。我想向用户显示数据。但是我很懒,我不想指定模板中的每个字段。我想要一个自动循环遍历特定书籍的每个字段并显示详细名称和数据的循环。

我目前已经完成的是,我可以通过在我的视图中访问我的模板中的数据:

book = Book.objects.get(id=book_id)

其中 book_id 由 url 注入(例如 site/book/1)。 所以,现在我可以访问模板中的每个字段,例如{{ book.name }} 或 {{ book.author }}。但是,为每个字段添加一个 html 段落需要大量的手动工作。

但是,我想在我的模板中添加这样的内容(只是一个示例,不必完全一样):

{% for field in book %}:
    {{ field.verbose_name }} {{ field.data }}
{% endfor %}

但是仅仅用我当前的 .get(id=book_id) 来做这件事是行不通的。而且,我也无法访问详细名称。

此外,如果该解决方案也适用于关系,那就太好了,例如:

{% for field in book.author %}:
    {{ field.verbose_name }} {{ field.data }}
{% endfor %}

这里显示当前选中书的作者表的所有数据。

无论如何,我希望我的解释清楚。我不太擅长提出明确的问题:(

谢谢!

【问题讨论】:

  • 获取verbose_namethis SO QA
  • 我刚刚从 Roger 那里找到了一个很好的答案 here,基本上是在滥用表格

标签: python django loops


【解决方案1】:

现在是的,您可以滥用 meta 来获取 verbose_name,但与此数据没有任何关联

{% for field in book._meta.fields %}
    {{ field.verbose_name }} 
{% endfor %}

我不确定这是多么正确,因为 Pep8 警告经常出现在元标记周围(我无法从模板方面看到这一点)

我鼓励你考虑使用values

作为一个小例子,这会给你一个可以迭代的字典(这个例子给出了 id 和 name)

Book.objects.filter(id=book_id).values('id', 'name')[0]
{% for key, val in book_fields %}
    {{ key }} {{ val }}
{% endfor %}

更好的方法是只获取您真正关心的字段(id 有时对每个人都没有太大帮助)

如果您从值中省略了字段,那么您确实会得到所有字段,但我不确定它是否使用了详细名称

Book.objects.filter(id=book_id).values()[0]

【讨论】:

  • 您可以将这些方法与zip 结合使用,但恐怕我现在没有时间为此创建解决方案
  • 感谢您的回复。我不知道我是否做错了什么,但是如果我尝试实现您的建议,它只会显示 2 个字段名称(没有详细名称)并且没有字段数据。而且,更奇怪的是:每次我重新启动站点时,它都会显示 book 表中的 2 个不同(随机?)字段。但是,我会更好地看看你今天晚些时候链接到的“价值观”。另外,您在另一条评论中添加的链接看起来不错,我也会看看。
  • @landcross - 是的,我链接的答案非常漂亮,老实说我自己更喜欢它
猜你喜欢
  • 2012-01-19
  • 2020-08-03
  • 2011-02-06
  • 2017-12-14
  • 2016-08-31
  • 2012-09-15
  • 1970-01-01
  • 2012-12-25
  • 2011-11-10
相关资源
最近更新 更多