如何让Django识别自定义模板标签?

时间:2013-01-01 20:28:16

标签: django django-templates

我的项目目录如下所示。 settings_value.py有一个模板标记,其中包含“settings_value”。在我的settings.py中,我将'itslogical.templatetags'添加到INSTALLED_APPS。我尝试在logicalhp/home.html中使用它,但它说标签不存在。我正在使用this answer中的代码(我将名称从'value_from_settings'更改为'settings_value')。

.
├── internetparse
│   └── ...
├── itslogical
│   ├── settings.py
│   ├── templates
│   │   └── itslogical
│   │       └── base.html
│   └─── templatetags
│       ├── __init__.py
│       └── settings_value.py
├── logicalhp
│   ├── templates
│   │   └── logicalhp
│   │       └── home.html
│   └── views.py
└── manage.py

如果您还有其他需要,请告诉我。我在这里缺少什么?

编辑:添加了代码并更新了错误。这是基于@ Dan的答案。

500 ERROR:
'settings_value' is not a valid tag library: Template library settings_value not found
Template library settings_value not found, tried django.templatetags.settings_value ...
#!/usr/bin/env python

from django import template
from django.conf import settings

# Include settings from here in templates
register = template.Library()

# settings value
@register.tag
def settings_value(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, var = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents.split()[0]
    return ValueFromSettings(var)

class ValueFromSettings(template.Node):
    def __init__(self, var):
        self.arg = template.Variable(var)

    def render(self, context):
        return settings.__getattr__(str(self.arg))

3 个答案:

答案 0 :(得分:1)

您不应将templatetags目录添加到已安装的应用程序中。您应该将templatetags目录放在现有应用程序中,并将其添加到已安装的应用程序中。

答案 1 :(得分:1)

尝试将templatetags文件夹移动到logicalhp

答案 2 :(得分:0)

问题的一部分是我的settings.py中的拼写错误(在'itslogical'中写了'logicalhp.templatetags')。更大的问题是它试图从我的设置中获取属性"STATIC_URL"。它包括引号,所以它实际上是settings.__getattr__('"STATIC_URL"')

为了解决这个问题,我添加了一个条带。

return settings.__getattr__(str(self.arg)) #before
return settings.__getattr__(str(self.arg).strip('"')) #after

(顺便说一句,它不像你可以省略模板中的引号;否则它认为它是一个变量。)