Подтвердить что ты не робот

Поле 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 }}
4b9b3361

Ответ 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