Django - 模板对象访问详细名称

Pie*_*NAY 12 html django templates

我有一个Scrib模型和一个Scrib.objects.all()存储到的模板scribs

在模板中,我想访问模型的详细名称,如:

<h1>{{ scribs.model.verbose_name }}</h1>
Run Code Online (Sandbox Code Playgroud)

是否可以或者我必须将Scrib处理程序添加到上下文中?

WTK*_*WTK 10

您无法直接从模板访问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 }}
Run Code Online (Sandbox Code Playgroud)

选项二:给自己写一个视图助手,它将返回给定类的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>
Run Code Online (Sandbox Code Playgroud)

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 }}
Run Code Online (Sandbox Code Playgroud)

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 ...
Run Code Online (Sandbox Code Playgroud)

Scrib现在继承自CustomModel,它为我们提供了属性.任何将从CustomModel类继承的模型都将具有此属性.这是最干净,最灵活的解决方案.


aug*_*men 8

我也想这样做,我想另一种解决方案是模板过滤器:

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
Run Code Online (Sandbox Code Playgroud)

然后在模板中:

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

1 scrib, 2 scribs
Run Code Online (Sandbox Code Playgroud)

  • 这似乎导致 Django 3.0 中的“str”对象没有属性“_meta” (2认同)

Uku*_*kit 5

作为WTK建议的替代方案,您可以在此处为Scrib模型定义一个方法models.py:

def get_verbose_name(self):
    return self._meta.verbose_name
# in templates
{{ scrib_instance.get_verbose_name }}
Run Code Online (Sandbox Code Playgroud)