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

Django - доступ к подробным именам объектов шаблонов

У меня есть модель Scrib и шаблон, который получает Scrib.objects.all(), хранящийся в scribs

В шаблоне я хотел бы получить доступ к подробному имени модели, например:

<h1>{{ scribs.model.verbose_name }}</h1>

Возможно ли, или мне нужно добавить обработчик Scrib в контекст?

4b9b3361

Ответ 1

Вы не можете получить доступ к verbose_name непосредственно из шаблона. Из того, что я вижу, у вас есть три варианта.

Вариант один (простейший). Назначьте подробное имя в своем контроллере, а затем получите доступ к нему из шаблона:

# in controller
render_to_response('template.html', {'scrib_verbose_name': Scrib._meta.verbose_name})

# in a view template.html
Verbose name of a Scrib model: {{ scrib_verbose_name }}

Вариант второй: напишите себе помощник вида, который вернет verbose_name (или другое поле из класса _meta) для данного класса.

Обновить Третий вариант (подсказка шляпы для Uku Loskit) - определить метод на модели scrib, который возвращает метаобъект (или любое конкретное поле из него).

# method in a Scrib model
def meta(self):
    return self._meta

# later on in a template - scrib is a instance of Scrib model
<h1>{{ scrib.meta.verbose_name }}</h1>

Update2 Если вы настаиваете на непосредственном доступе к подробному имени из scribs (который является результатом Scrib.objects.all()), вы можете делать такие вещи, как:

scribs = Scrib.objects.all()
scribs.verbose_name = Scrib._meta.verbose_name

# in a template you can now access verbose name from a scribs variable
{{ scribs.verbose_name }}

Update3 Еще один способ - использовать модель inhertinace для доступа к подробному имени из экземпляра любой модели, которая наследуется от нашего пользовательского.

# base model (inherits from models.Model)
class CustomModel(models.Model):
    def meta(self):
        return self._meta

    class Meta:
        abstract = True

# Scrib now inherit from CustomModel
class Scrib(CustomModel):
    # do any stuff you want here ...

Scrib теперь наследуется от CustomModel, который предоставляет нам свойство meta. Любая модель, которая наследуется от класса CustomModel, будет иметь это свойство. Это самое чистое и гибкое решение.

Ответ 2

Я тоже хочу это сделать, я полагаю, что другим решением будет фильтр шаблонов:

from django import template
register = template.Library()

@register.filter
def verbose_name(value):
    return value._meta.verbose_name

@register.filter
def verbose_name_plural(value):
    return value._meta.verbose_name_plural

Затем в шаблоне:

1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }}

1 scrib, 2 scribs

Ответ 3

В качестве альтернативы предложению WTK вы можете определить метод для модели Scrib в models.py следующим образом:

def get_verbose_name(self):
    return self._meta.verbose_name
# in templates
{{ scrib_instance.get_verbose_name }}