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


82

我想要一个菜单​​,可以根据您所属的组进行定制。我正在使用Django 1.10.1,allauth等。当我试图使我的templatetag失败时,它说:

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的一部分。我究竟做错了什么?

Answers:


132

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


8
重新启动服务器!太感谢了!
FMCorz

2
对我来说,缺少的__init__.pytemplatetags文件夹...
zypro

这就是为什么我喜欢stackoverflow
Oto Shavadze

70

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

            }
    },
},

]


2
非常感谢:)无法使它以其他方式工作。
乔纳森

1
它也对我有用。这实际上可能是该问题的选择答案。我正在使用Django的2.0版本,以防人们感到奇怪。
RRC

这使我可以在整个项目中使用自定义标签
dangel

如果您需要覆盖站点程序包的特定模板标记,这也可以使用
Nico M

这应该是答案:我使用Django3.x。
FearlessFuture

35

确保您没有丢失以下任何步骤:

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

  2. 您的应用程序必须位于settings.py中的INSTALLED_APPS中

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

  4. 重新启动Django服务器


在我看来,我所有的应用程序都需要包含apps.py和init .py default_app_config = 'custom_admin.apps.Config'。否则,Django 1.10不会加载模板标签。我在文档中没有明确看到这一点。
克里斯·萨丁格

谢谢!我忘了添加__ini__.py,但是您知道为什么它曾经在Python3中起作用但在Python2中不起作用吗?
Farzad Abdolhosseini

2
每次重启都是让我兴奋的!感谢在#4 ^^上提醒我
Marc

第4点帮助我“重新启动Django服务器”,因此Django可以识别新的模板标签。
Feras

21

就我而言,问题是,我正在使用 {% load filter_method_name %}

我不得不换成 {% load filename %}

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


2
重新启动服务器,这样一个令人讨厌的错误的简单解决方案
Ahmed I. Elsayed

文件名是我的文件名。谢谢!
馄饨

@ravioli是的,需要注意的是非常微妙的一点
Shamsul Arefin Sajib,

谢谢!我完全忽略了这一点,因为我假设我需要加载方法而不是模块本身。
雄伟像素



3

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

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

代替

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

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


这是我的问题!
elplatt

3

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


这个问题已经有很多答案了,这篇文章没有添加其他答案没有提到的内容。
亨利·伍迪

2

我正在使用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'时,这对我有用。
威廉

1

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

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

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


1

我通过在根目录中添加一个templatetag文件夹并定义了过滤器的filter.py文件来解决此问题,然后调整了settings.py

请在这个类似的线程中检查有关此问题的完整答案


0

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

从app_name.templatetags导入my_templatetag


在templatetags文件夹中,创建名称为init .py的空白文件
Kiran Bachhav。

2
编辑您的答案以将所有详细信息放入其中,并对其进行格式化以使其易于阅读(在适当的地方使用代码格式)。
Melebius

0

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


0

是的,由于较旧的django版本,您目前面临的这个问题或复杂地编写“折旧”

如果模板/ HTML文件中有这些类型的TAg,请使用它们进行更改。

> {{% load staticfiles %} or  {% load admin_static %}, {% load
> admin_static %}}

改变


{% load static %}

到达重点。只需执行这些操作,即可从YOur BAse.html /或任何类型的HTML替换所有这些


您能纠正这个混乱的描述吗?我很难理解你的解释。还请更正代码格式。参见答案
-Gander

-1

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


2
剪切然后粘贴回代码将有何帮助?如果您在问题的示例代码中看到错误,请指出。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.