建议我有一个模特:
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 }}
答案 0 :(得分:52)
您可以使用以下python代码
Test._meta.get_field("name").verbose_name.title()
如果你想在模板中使用它,那么最好为此注册模板标签。在您的应用内创建一个templatetags
文件夹,其中包含两个文件(__init__.py
和verbose_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
。
答案 1 :(得分:5)
psjinx的方法太棒了!
如果你想生成一个字段列表,也许你会喜欢这个。
在类Test中添加一个iterable可以方便地列出字段的详细名称和值。
<强>模型强>
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 %}
答案 2 :(得分:1)
基于这个答案https://stackoverflow.com/a/14498938。在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()
具体示例的abbove过滤器中的实例是myapp.mymodel我将实例评估为模型对象,并且i返回字段详细名称
它适用于django 1.9
答案 3 :(得分:0)
现在给出答案可能为时已晚,但我遇到了同样的问题,直到我意识到我是通过覆盖 form.py (self.fields['fieldname'] = ..) 中的字段引起的。如果你这样做,你还需要设置一个标签,否则它使用从字段名派生的标签。
希望这个快速回复有意义。