【问题标题】:field's verbose_name in templates模板中字段的详细名称
【发布时间】:2013-01-07 22:49:56
【问题描述】:

假设我有一个模型:

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 }}

【问题讨论】:

标签: django django-templates


【解决方案1】:

accepted answer 中的方法太棒了!

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

向 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 %}

【讨论】:

  • 这是个好主意!它可能是一个名为 list_fields 的方法,它会更明确一点 (for field, value in instance.list_fields) 并且不那么混乱(迭代 XyzModel 实例意味着什么?)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    基于这个答案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

    【讨论】:

      【解决方案4】:

      您可以为此使用以下 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" %}
      

      您可以在官方 django 文档中了解Custom template tags

      【讨论】:

      • 只是一个小警告:如果您使用.title(),则该字符串将无法正确翻译,除非您已经在其他地方设置了该字符串(“名称”)以进行翻译。为避免这种情况,请跳过title() 并担心css 中的样式(更不用说title() 的使用并非对所有语言都正确)
      猜你喜欢
      • 2016-07-18
      • 2011-11-17
      • 2011-12-09
      • 1970-01-01
      • 2010-10-29
      • 2011-01-26
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多