gpt4 book ai didi

django - 如何访问模板中的模型字段详细名称?

转载 作者:行者123 更新时间:2023-12-05 06:13:43 25 4
gpt4 key购买 nike

这个问题有答案here ,但它已过时且不正确,因为它在模板中不起作用。

我正在使用标准的 ListView 来访问模板中的对象。我想在表中显示我的对象,表头中包含字段名称,表体中包含字段值。

要做到这一点,相当简单,但我不确定如何访问对象字段名称。您不能使用 {{ object._meta.get_field[field].verbose_name }} 因为 _meta 在模板中不可用。

例如:首先,我将要呈现的字段列表添加到上下文中:

   def get_context_data(self, **kwargs):
context['fields'] = ['id', 'email', 'name']

然后我在模板中循环它们:

<table>
<thead>
{% for object in object_list %}
{% if loop.first %}
<tr>
{% for field in fields %}
// MISSING CODE //
{% endfor %}
</tr>
{% endif %}
{% endfor %}
</thead>
<tbody>
{% for object in object_list %}
<tr>
{% for field in fields %}
<td>{{ object[field] }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>

这很好用,因为它只显示我想要在正文中显示的字段,但不知何故我需要访问对象上的字段详细名称。我想我可以在上下文中传递 dict 而不是列表(使用 field:verbose_name key:value 对),但这感觉不太干。

有什么想法吗?

最佳答案

我遇到了同样的问题,所以我创建了一个 mixin,它将 model._meta 暴露给模板,并从模型中创建一个字段列表。 mixin 覆盖了默认的 get_context() 方法。

在 mixin 中修改字段列表比在模板中尝试更清晰,但我仍然希望访问标题的 model._meta.verbose_name 之类的东西,所以我通过了 model._meta也作为附加上下文。

这是混音:

# views.py
#=================================================================

class ExtraContextMixin:
"""Add the model meta and model fields as objects to the context.

Ignores the primary key and fields that are not editable.
"""
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['model_meta'] = self.model._meta
context['fields'] = []
for fld in self.model._meta.get_fields():
if fld.editable and not fld.primary_key:
context['fields'].append(fld)
return context

因此对于您的 ListView (或任何其他基于类的 View ),您只需添加 mixin。确保 ExtraContextMixin 是第一个,这样它将正确覆盖 get_context_data()。此外,请确保在模块中使用它的任何类之前定义 ExtraContextMixin

# views.py
#=================================================================

class FooListView(ExtraContextMixin, ListView):
...

为了确保每个对象的数据与每个字段标题正确匹配,我制作了一个自定义模板标签。如果您使用任何已定义选项的字段,该标记还有显示人类可读选项的额外好处。

# custom_tags.py
#=================================================================

from django import template

register = template.Library()

@register.simple_tag
def get_field_data(object, field):
"""Get human-readable data from the field to be used in an html template."""
# Get the data stored in the given field
data = getattr(object,field.name)
# If the field has choices defined, return the human-readable
# version of the data.
if not getattr(field,'choices') is None:
choice_dict = dict(field.choices)
data = choice_dict[data]
return data

然后您可以像这样在模板中实现它:

# template.html
#=================================================================

{% load custom_tags %}

<table>
<thead>
{% for field in fields %}
<th>{{field.verbose_name|capfirst}}</th>
{% endfor %}
</thead>
<tbody>
{% for object in object_list %}
<tr>
{% for field in fields %}
<td>
{% get_field_data object field %}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>

关于django - 如何访问模板中的模型字段详细名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63190447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com