我有一个名为Scrib
的模型和一个模板,其中Scrib.objects.all()
被存储到scribs
中。
在模板中,我想访问模型的可读名称,例如:
<h1>{{ scribs.model.verbose_name }}</h1>
是否可能,或者我必须将Scrib
处理程序添加到上下文中?
您无法直接从模板访问verbose_name。根据我所看到的,有三个选项。
第一种选择(最简单的方法)。在控制器中分配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>
更新2 如果您坚持直接访问scribs
中的verbose name(它是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 }}
更新3 另一种方法是使用模型继承,以便能够从任何继承我们自定义模型的实例中访问显示名称。
# 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类的模型都将具有此属性。这是最清晰和最灵活的解决方案。
我也希望能做到这一点,我想另一个解决方案可能是使用模板过滤器:
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
除了WTK的建议,你还可以在models.py
中为Scrib模型定义一个方法,如下所示:
def get_verbose_name(self):
return self._meta.verbose_name
# in templates
{{ scrib_instance.get_verbose_name }}
scribs
等同于Scrib.objects.all()
,因此它是一个多个对象。我是否需要将Scrib
替换为Scrib.objects.all()
放入scribs
中? - Pierre de LESPINAY.meta.verbose_name
。如果您想要仅显示一次(例如在实际循环之前),则可以使用{{ scribs.0.meta.verbose_name }}
来显示使用scribs数组中的第一个scrib的verbose name。 - WTK