Django - 创建自定义模板标签以显示模型名称

Posted

技术标签:

【中文标题】Django - 创建自定义模板标签以显示模型名称【英文标题】:Django - Creating a Custom Template Tag to show Model Name 【发布时间】:2018-06-19 02:17:56 【问题描述】:

我有一个模型:

class Survey(models.Model):
name = models.CharField(max_length = 200)

def __str__(self):
    return self.name

我想在我的模板中显示当前调查模型的名称:

<h1> survey.name |name </h1>

我正在使用自定义模板标签/过滤器来显示该名称;但是,它显示为“str”而不是当前调查模型的名称。

这里是过滤代码:

from django import template

register = template.Library()

@register.filter
def name(value):
return value.__class__.__name__

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

当您使用&lt;h1&gt; survey.name |name &lt;/h1&gt; 调用模板标记时,您将传递与模型关联的字符串。由于该字段是CharField,它将返回一个字符串,因此该类的名称是str

我相信您想要的是&lt;h1&gt; survey|name &lt;/h1&gt;,它将向模板标签发送Survey 的实例,从而从中获取类名。

【讨论】:

所以我把它改成了survey|name,它仍然在html中输出'str'。你认为我写的过滤器有问题吗?它是否应该返回其他东西? 我认为它归结为您传递的变量。我已经使用模板标签进行了测试,并且可以正常工作。您能否将添加survey 的代码粘贴到上下文中?例如在视图或上下文处理器中【参考方案2】:

作为上述答案的补充......

您的过滤器正在调用__class__.__name__,我相信它会返回str

尝试更改您的过滤器以返回 value.__name__

See this similar question

【讨论】:

【参考方案3】:

你可以这样做:

如果你在 meta 中定义了 verbose_name 那么你可以这样做:

return (model-name)._meta.verbose_name

否则你可以这样做:

返回(型号名称)。名称

【讨论】:

以上是关于Django - 创建自定义模板标签以显示模型名称的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中自定义模板标签以过滤博客中的特色帖子

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径

Teleport - django 自定义标签

Django - 自定义模板标签传递关键字参数

Django,自定义标签...怎么样?

使用 Form 标签在 Django 模板中获取模型的名称