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

Posted

技术标签:

【中文标题】Django 1.10.1 \'my_templatetag\' 不是注册标签库。必须是以下之一:【英文标题】:Django 1.10.1 'my_templatetag' is not a registered tag library. Must be one of:Django 1.10.1 'my_templatetag' 不是注册标签库。必须是以下之一: 【发布时间】:2017-04-02 20:13:53 【问题描述】:

我想要一个自定义菜单,具体取决于您所属的组。 我正在使用 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 的一部分。 我做错了什么?

【问题讨论】:

【参考方案1】:

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

【讨论】:

对我来说,是 templatetags 文件夹中缺少的 __init__.py ... 这个。一个人可能会花费很长时间来调试一些如果你重新启动就可以工作的东西......【参考方案2】:

从 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',
            
            
    ,
,

]

如果您的项目目录中有模板标签目录(不是在应用程序目录中),则建议使用上述方法。

示例-

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

【讨论】:

它也对我有用。这实际上可能是该问题的选择答案。我正在使用 2.0 版本的 django,以防人们想知道。 这让我可以在整个项目中使用自定义标签 如果您需要覆盖站点包的特定模板标签,这也可以工作 这应该是答案:我使用 Django 3.x。 你在哪里找到这个解释。它没有在文档中说明,但它是唯一对我有用的东西。【参考方案3】:

确保您没有遗漏以下任何步骤:

    在models.py同级创建一个名为“templatetags”的文件夹 和你的应用程序文件夹中的views.py

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

    templatetags 文件夹必须有 __init__.py

    重启django服务器

【讨论】:

在我看来,我所有的应用程序都需要一个 apps.py 和 init.py 来包含 default_app_config = 'custom_admin.apps.Config'。否则 Django 1.10 不会加载模板标签。我没有在文档中明确看到这一点。 谢谢!我忘了加__ini__.py,但是你知道为什么它曾经在Python3中可以工作,而在Python2中却不行吗? 每次都让我重新开始!谢谢你提醒我#4 ^^ 第 4 点帮助我“重新启动 Django 服务器”,让 Django 可以识别新的模板标签。【参考方案4】:

就我而言,问题是,我使用的是% load filter_method_name %

我不得不改成% load filename %

然后我不得不重新启动服务器。

【讨论】:

重启服务器,这样一个恼人的bug的简单解决方案 文件名是给我的。谢谢! @ravioli 是的,需要注意的非常微妙的事情 谢谢!我完全忽略了这一点,因为我假设我需要加载方法而不是模块本身。 重启服务器【参考方案5】:

您必须手动停止开发服务器并重新启动它, 所以 Django 可以识别新的模板标签

【讨论】:

【参考方案6】:

我使用的是 Django 1.11,我遇到了同样的问题。这里的一些答案是正确的,但有些东西可能会丢失。这是我所做的:

引用以前的用户:

在models.py同级创建一个名为“templatetags”的文件夹 和你的应用程序文件夹中的views.py

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

templatetags 文件夹必须有 init.py

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

from django import template
register = template.Library()

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

【讨论】:

当我使用 'init.py' 而不是 'init.py' 时,这对我有用。 两者有什么区别?一个是粗体另一个是普通字体,看不懂你的说法@William 看起来下划线现在在*** cmets中加粗了:) 我写了init.py,在'init'的两边都有两个下划线。以 Chris Shaw 的回答为例。【参考方案7】:

“my_templatetag.py”存储在哪里?它应该存储在应用程序内名为“templatetags”的目录中。

请看:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ 如果不是这样的话。

【讨论】:

谢谢,这是地图名称!【参考方案8】:

重启 django 服务器。在应用程序中设置模板标签文件夹和模板标签文件夹中的 template_name.py 后,它对我有用。

【讨论】:

【参考方案9】:

如果它对某人有帮助,我的问题是我在尝试加载标签时使用了引号

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

而不是

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

注意:extends 需要在文件名周围加上引号,而不是 load

【讨论】:

这是我的问题!【参考方案10】:

我知道这有点老了,但我今天遇到了同样的问题。我在文档中找到了解决方案:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

应用程序应该包含一个 templatetags 目录,与 models.py、views.py 等处于同一级别。如果这还不存在,请创建它 - 不要忘记 __init__.py 文件以确保该目录被视为 Python 包。

只需将 __init__.py 从另一个位置复制到新模板标签的目录中即可。

【讨论】:

【参考方案11】:

我通过在根目录中添加一个 templatestag 文件夹以及定义我的过滤器的 filter.py 文件解决了这个问题,然后我调整了我的 settings.py强>。

请在this similar thread查看我关于这个问题的完整答案

【讨论】:

【参考方案12】:

将 my_templatetag.py 放入 app_name/templatetags 然后在 app_name/templatetags 中创建 init.py .. 然后在项目文件夹中打开终端给出命令 python manage.py shell

从 app_name.templatetags 导入 my_templatetag

【讨论】:

在 templatetags 文件夹内创建名为 init.py 的空白文件 请edit your answer 将所有详细信息放入其中并将其格式化为可读(在适当的情况下使用代码格式)。【参考方案13】:

您只需剪切/删除编写在(示例 templatetags/home.py)中的代码 从 home.py 中删除代码并重新启动服务器,然后再次将代码粘贴到 home.py 中,它将起作用。

【讨论】:

【参考方案14】:

templatetags 文件夹必须有一个 __init__.py 文件才能成为regular python package

确保您还在 __init__.py 文件旁边创建了 templatetags.py 文件

【讨论】:

【参考方案15】:

首先停止服务器。从 templatetags/tag.py 中删除/剪切代码并重写/粘贴它。然后运行服务器。它对我有用

【讨论】:

如何在代码中剪切,然后粘贴回来?如果您在问题的示例代码中看到错误,请指出。【参考方案16】:

是的,你目前面临的这个问题是因为旧的 django 版本或者复杂地写“折旧”

如果您的模板/ Html 文件中有这些类型的标签,请将它们更改为..

> % load staticfiles % or  % load admin_static %, % load
> admin_static %

改变


% load static %

切入正题.. 只需简单地执行这些替换所有这些来自您的 BAse.html/或任何类型的 HTML

【讨论】:

你能纠正这个乱七八糟的描述吗?我很难理解你的解释。还请更正代码格式。见How to Answer

以上是关于Django 1.10.1 'my_templatetag' 不是注册标签库。必须是以下之一:的主要内容,如果未能解决你的问题,请参考以下文章

Django+uwsgi+Nginx安装部署

《跟老齐学Python Django实战》读后感

Django资源

django基础- 分页组件

1django实战---简单的博客系统

Django 模板不存在