Django 1.10.1 'my_templatetag' 不是一个已注册的标签库。必须是以下之一:

125
我希望有一个可以根据用户组定制的菜单。我正在使用Django 1.10.1和allauth等工具。当我尝试创建模板标签时失败了,并显示以下内容:

TemplateSyntaxError at /
'my_templatetag' is not a registered tag library. Must be one of:
account
account_tags
admin_list
admin_modify
admin_static
admin_urls
cache
i18n
l10n
log
socialaccount
socialaccount_tags
static
staticfiles
tz

'my_templatetag.py' 看起来像这样:

from django import template
from django.contrib.auth.models import Group


register = template.Library()

@register.filter(name='has_group')
def has_group(user, group_name):
    group =  Group.objects.get(name=group_name)
    return group in user.groups.all()

错误出现在我的 .html 文件中,提示如下:

{%  load my_templatetag %}
我已经尝试了成千上万次重新启动服务器,还尝试更改所有名称,该应用程序也是settings.py中INSTALLED_APPS的一部分。我做错了什么?
19个回答

213
除了将my_templatetag.py放在app_name/templatetags中外,每次修改模板标签时,请确保重新启动Django开发服务器(或确保它自己重新启动)。如果服务器没有重新启动,则Django不会注册这些标记。

6
对我来说,问题出在模板标签文件夹中缺少了***init.py***文件... - zypro
2
这个问题可能只需要重新启动一下就能解决,但有时候人们会因为调试而浪费很长时间。 - logicOnAbstractions

111

从Django 1.9开始,您可以像这样在设置中加载那些新的标签/过滤器:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'app.apptemplates.load_setting',
            
        ],
                
        'libraries':{
            'my_templatetag': 'app.templatetags.my_templatetag',
            
            }
    },
},

如果您的项目目录中有templatetag dir(而不是应用程序目录),则建议使用上述方法。

例如:
enter image description here

引用: https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/#:~:text=It%20also%20enables%20you%20to%20register%20tags%20without%20installing%20an%20application


2
这对我也起作用了。这实际上可能是问题的选定答案。如果有人想知道,我正在使用Django 2.0版本。 - R.R.C.
这使我能够在整个项目中使用自定义标签。 - dangel
如果需要覆盖站点包的特定模板标签,可以使用此方法。 - NiMeDia
4
这应该是答案:我使用的是Django 3.x。 - FearlessFuture
你在哪里找到这个解释的?文档中没有提到,但这是唯一有效的方法。 - benji8
无法正常工作。 指定了无效的模板库。尝试加载时引发了 ImportError 错误... - Conor

53

请确保您不会错过以下任何步骤:

  1. 在应用程序文件夹的 models.py 和 views.py 相同级别创建一个名为 "templatetags" 的文件夹

  2. 在 settings.py 中必须将您的应用程序添加到 INSTALLED_APPS

  3. templatetags 文件夹必须有 __init__.py 文件

  4. 重新启动 Django 服务器


1
对我来说,似乎所有我的应用程序都需要一个apps.py和__init__.py文件,并包含default_app_config ='custom_admin.apps.Config'。否则,Django 1.10将无法加载templatetags。虽然我在文档中没有明确看到这一点。 - Chris Sattinger
我忘记添加 __ini__.py 文件了,但是你知道为什么它在 Python3 中可以工作而在 Python2 中却不行吗? - Farzad Abdolhosseini
2
每次都是重新启动让我感到困扰!谢谢你在第四点提醒我^^ - Marc
第四点帮助我“重新启动Django服务器”,这样Django就可以识别新的模板标签。 - 0xFK
忘记重启了。它可以工作了。 - JayB

27
在我的情况下,问题出在我使用了 {% load filter_method_name %},我需要改为 {% load filename %}。然后我需要重启服务器。

4
重启服务器,这是一个解决讨厌的漏洞的简单方法。 - Ahmed I. Elsayed
1
文件名对我来说没问题。谢谢! - ravioli
@ravioli 是的,这是一个非常微妙的事情需要注意。 - Shamsul Arefin
谢谢!我完全忽略了这一点,因为我以为我需要加载方法而不是模块本身。 - Majestic Pixel
重启服务器 - Rafi khan
@Rafikhan 我在尝试重新启动之前并没有发布这个解决方案。我尝试了重新启动,但没有起作用。然后我修正了代码中的错误并重新启动了。 - Shamsul Arefin

10
您需要手动停止开发服务器并重新启动它,这样Django才能识别新的模板标签。

5

1
谢谢,那就是地图名称! - Sliljedal

5

我正在使用Django 1.11,之前也遇到了同样的问题。这里的某些答案是正确的,但是可能还有一些细节需要注意。以下是我的解决方案:

引用之前用户的建议:

在应用程序文件夹中与models.py和views.py处于同一级别的位置创建一个名为“templatetags”的文件夹

你的应用程序必须在settings.py中的INSTALLED_APPS中

templatetags文件夹必须有init.py文件

但在重新启动Django服务器之前,请将以下内容添加到包含标签的文件中:

from django import template
register = template.Library()

然后您可以重新启动服务器。


当我使用'init.py'而不是'init.py'时,这对我起作用了。 - William
这两种有什么不同?一个是加粗的,另一个是普通字体,我理解不了你的说法@William - aspiring1
现在在stackoverflow评论中,下划线看起来是加粗的 :) 我写了带有两个下划线的__init__.py,一个在'init'的左侧,一个在右侧。可以参考Chris Shaw的答案。 - William

4
重新启动Django服务器。在应用程序内设置templatetag文件夹以及在templatetag文件夹中设置template_name.py后,对我起作用了。

3

如果有帮助的话,我遇到的问题是在尝试加载标签时使用引号。

{%  load 'my_templatetag' %}  <!-- incorrect -->

替代

{%  load my_templatetag %}  <!-- correct -->

注意:在文件名周围使用引号,但不需要在“load”周围使用引号。

这就是我的问题! - elplatt

1
我知道这有点老了,但我今天遇到了相同的问题。我在文档中找到了解决方案:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ 引用:
应用程序应包含一个templatetags目录,与models.py、views.py等处于同一级别。如果不存在这个目录,请创建它 - 不要忘记__init__.py文件,以确保该目录被视为Python包。
只需将__init__.py从另一个位置复制到新的templatetag目录中即可解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接