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】:当您使用<h1> survey.name |name </h1>
调用模板标记时,您将传递与模型关联的字符串。由于该字段是CharField
,它将返回一个字符串,因此该类的名称是str
。
我相信您想要的是<h1> survey|name </h1>
,它将向模板标签发送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 - 创建自定义模板标签以显示模型名称的主要内容,如果未能解决你的问题,请参考以下文章