26

假设我有一个模型:

from django.db import models

class Test(models.Model):
    name=models.CharField(max_length=255, verbose_name=u'custom name')

如何在模板中获取模型字段的详细名称?以下不起作用:

{{ test_instance.name.verbose_name }}

我非常感谢这个解决方案,就像我们在使用表单时所做的那样,在模板中使用标签属性:

{{ form_field.label }}
4

4 回答 4

61

您可以为此使用以下 python 代码

Test._meta.get_field("name").verbose_name.title()

如果您想在模板中使用它,那么最好为此注册模板标签。在您的应用程序内创建一个templatetags文件夹,其中包含两个文件(__init__.pyverbose_names.py)。将以下代码放入verbose_names.py

from django import template
register = template.Library()

@register.simple_tag
def get_verbose_field_name(instance, field_name):
    """
    Returns verbose_name for a field.
    """
    return instance._meta.get_field(field_name).verbose_name.title()

现在,您可以在加载库后在模板中使用此模板标记,如下所示:

{% load verbose_names %}
{% get_verbose_field_name test_instance "name" %}

您可以阅读Custom template tags官方 django 文档。

于 2013-01-24T10:21:52.213 回答
9

接受的答案中的方法很棒!

如果你想生成一个字段列表,也许你会喜欢这个。

向 Test 类添加一个可迭代对象可以方便地列出字段的详细名称和值。

模型

class Test(models.Model):
...
def __iter__(self):
    for field in self._meta.fields:
        yield (field.verbose_name, field.value_to_string(self))

模板

{% for field, val in test_instance %}
<div>
    <label>{{ field }}:</label>
    <p>{{ val }}</p>
</div>
{% endfor %}
于 2014-03-07T08:15:46.247 回答
1

基于这个答案https://stackoverflow.com/a/14498938 .in Django 模型我添加

class Meta:
  app_name = 'myapp'

在列表视图中我有

from django.core import serializers
context['data'] = serializers.serialize( "python", self.get_queryset() )

在 mylist.html 我有

{% for field, value in data.0.fields.items %}
<th style="text-align:center;">{% get_verbose_field_name data.0.model field %}</th>
{% endfor %}

在过滤器中:

from django import template
register = template.Library()
from .models import Mymodel
@register.simple_tag
def get_verbose_field_name(instance, field_name):
  """
  Returns verbose_name for a field.
  """
  myinstance = eval(instance.split('.')[1].title())
  return myinstance._meta.get_field(field_name).verbose_name.title()

具体示例的上述过滤器中的实例是 myapp.mymodel 我将实例评估为模型对象,并且我返回字段详细名称

它适用于 django 1.9

于 2016-06-29T09:01:30.493 回答
0

回答可能为时已晚,但我遇到了同样的问题,直到我意识到我是通过覆盖 form.py (self.fields['fieldname'] = ..) 中的字段引起的。如果这样做,您还需要设置标签,否则它使用从字段名派生的标签。

希望这个快速回复有意义。

于 2021-07-27T16:51:10.880 回答