Django - Объекты шаблона получают доступ к подробному имени - PullRequest
12 голосов
/ 15 сентября 2011

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 15 сентября 2011

Вы не можете получить доступ к 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 Еще один способ - использовать наследование модели, чтобы иметь возможность получить доступ к подробному имени из экземпляра любой модели, которая наследуется от нашей пользовательской.

# 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, будет иметь это свойство.Это самое чистое и гибкое решение.

8 голосов
/ 14 декабря 2012

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

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
5 голосов
/ 15 сентября 2011

В качестве альтернативы предложению WTK вы можете определить метод для модели Scrib в вашей models.py, например:

def get_verbose_name(self):
    return self._meta.verbose_name
# in templates
{{ scrib_instance.get_verbose_name }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...