字段在模板中的verbose_name

Del*_*emm 25 django django-templates

建议我有一个型号:

from django.db import models

class Test(models.Model):
    name=models.CharField(max_length=255, verbose_name=u'custom name')
Run Code Online (Sandbox Code Playgroud)

如何在模板中获取模型的字段详细名称?明显{{ test_instance.name.verbose_name }}不起作用.

我非常喜欢解决方案,就像使用表单一样,在字段模板中可以使用label属性

{{ form_field.label }}
Run Code Online (Sandbox Code Playgroud)

pan*_*843 56

您可以使用以下python代码

Test._meta.get_field("name").verbose_name.title()
Run Code Online (Sandbox Code Playgroud)

如果你想在模板中使用它,那么最好为此注册模板标签.templatetags在您的应用内创建一个包含两个文件的文件夹(__init__.pyverbose_names.py).Put代码如下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()
Run Code Online (Sandbox Code Playgroud)

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

{% load verbose_names %}
{% get_verbose_field_name test_instance "name" %}
Run Code Online (Sandbox Code Playgroud)

您可以Custom template tags在官方django文档中阅读.

  • 只是一个小警告:如果你使用`.title()`字符串将无法正确翻译,除非它恰好发生了你已经设置了该字符串("名称")以便在其他地方进行翻译.要避免这种情况,请跳过`title()`并担心css中的样式(更不用说使用`title()`对所有语言都不正确) (2认同)

mis*_*ite 6

psjinx的方法太棒了!

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

将一个iterable添加到类Test可以方便地列出字段的详细名称和值.

模型

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

模板

{% for field, val in test_instance %}
<div>
    <label>{{ field }}:</label>
    <p>{{ val }}</p>
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)