Поле verbose_name в шаблонах
Предложите, у меня есть модель:
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 }}
не работает.
Я бы очень одобрил решение так же, как при использовании форм, в шаблоне в поле можно использовать атрибут label
{{ form_field.label }}
Ответы
Ответ 1
Вы можете использовать следующий код 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" %}
Вы можете прочитать Custom template tags
в официальной документации django.
Ответ 2
psjinx метод является потрясающим!
И, возможно, вам понравится это, если вы хотите создать список полей.
Добавление итерации в класс Test позволяет удобно перечислять подробные имена и значения полей.
Model
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 %}
Ответ 3
на основе этого ответа fooobar.com/info/274640/.... в Django Model я добавил
class Meta:
app_name = 'myapp'
в listview у меня
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 я evalute в объект модели, а имя возвращаемого поля i
он работает в django 1.9