【问题标题】:Django - Creating a Custom Template Tag to show Model NameDjango - 创建自定义模板标签以显示模型名称
【发布时间】: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__

我在这里做错了什么?

【问题讨论】:

    标签: python django python-3.x django-templates django-custom-tags


    【解决方案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

      • 否则你可以这样做:

        返回(型号名称)。名称

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2013-10-29
        • 2018-06-17
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        相关资源
        最近更新 更多