Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html Django-模板对象访问详细名称_Html_Django_Templates - Fatal编程技术网

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

Html Django-模板对象访问详细名称,html,django,templates,Html,Django,Templates,我有一个Scrib模型和一个模板,它将Scrib.objects.all()存储到scribs 在模板中,我希望访问模型的详细名称,如: <h1>{{ scribs.model.verbose_name }}</h1> {{scribs.model.verbose_name} 是否可能,或者我必须将Scrib处理程序添加到上下文中?您不能直接从模板访问详细名称。据我所知,你有三个选择 方案一(最简单)。在控制器中分配详细名称,然后从模板访问它: # in contro

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

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

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

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

您不能直接从模板访问详细名称。据我所知,你有三个选择

方案一(最简单)。在控制器中分配详细名称,然后从模板访问它:

# 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 }}
1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }}

1 scrib, 2 scribs
选项二:为自己编写一个视图助手,它将返回给定类的详细名称(或来自_metaclass的其他字段)

更新第三个选项(Uku Loskit的帽尖)-在scrib模型上定义返回元对象(或其中任何特定字段)的方法

Update3另一种方法是使用继承自自定义模型的任何模型的实例中的model inheritace来访问详细名称

# 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类继承的模型都将具有此属性。这是最干净、最灵活的解决方案。

根据WTK的建议,您可以在
模型中定义Scrib模型的方法。py
如下:

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

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

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
然后在模板中:

# 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 }}
1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }}

1 scrib, 2 scribs

实际上,
scribs
等于
Scrib.objects.all()
所以它是一个多对象。我是否必须将
Scrib
改为
Scrib.objects.all()
放入
scribs
?如果您通过scribs在模板中循环,那么您可以对循环中Scrib的每个实例使用
.meta.verbose\u name
。如果只想显示一次(例如在实际循环之前),只需执行
{{scribs.0.meta.verbose\u name}
即可使用scribs数组中的第一个scrib显示详细的名称。我不能直接将模型
scrib
放入
scribs
,通过
scribs.objects.all
循环并使用
scribs.verbose\u name
或更简单的方法?否则,我将不得不在我所有的模型上都使用这个函数吗?你把事情搞得太复杂了,或者我就是得不到你想要的:)无论如何,我已经更新了我的答案,一旦我试图有一些可维护的东西。如果我使用
scribs.verbose\u name=Scrib.\u meta.verbose\u name
它会将问题推到视图中。每次我需要访问详细的名称时,我都会在某个地方进行修改。但如果没有其他方法,我会这样做。我必须为所有需要详细名称的对象创建此方法,还是有更简单的方法?@PierredeLESPINAY您可以有一个基本抽象模型,并让您的所有模型从中扩展。写一次,全部使用。这似乎导致Django 3.0中的
“str”对象没有属性“\u meta”