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个回答

1
我通过在根目录下添加一个名为templatestag的文件夹,并在其中定义了我的过滤器的filter.py文件,然后调整了我的settings.py来解决这个问题。
请查看this similar thread中关于此问题的完整答案。

1
对我来说,我必须将我的客户过滤器注册为这个,因为我的模板标签位于任何应用程序之外。
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, 'templates'],
        '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',
                'django.template.context_processors.media',
            ],
            # ! New Line
            'libraries':{
                'customFilter': 'templatetags.customFilter',
            }
        },
    },
]

0

templatetags文件夹必须有一个__init__.py文件才能成为常规Python包

请确保你同时在__init__.py文件旁边创建了templatetags.py文件。


仍然没有解决任何问题。 - Conor

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

你只需要删除位于(例如templatetags/home.py)中编写的代码。 从home.py中删除您的代码,重新启动服务器,然后再将代码粘贴到home.py中,它就可以工作了。


0

我知道这很旧了,但在您的情况下,您应该尝试{% load has_group from my_templatetag %}


0
这解决了我的问题:
1. 确保主 Django 项目中存在 templatetags 文件夹。 2. 在项目的 settings.py 文件中的 INSTALLED_APPS 中使用以下代码行:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
     ...
  
    'my_app.apps.AppConfig',
    
]

-1

首先停止服务器,从templatetags/tag.py中删除/剪切代码并进行重写/粘贴。然后重新启动服务器。这对我起了作用。


2
剪切代码,然后粘贴回去会有什么帮助?如果您在问题的示例代码中发现错误,请指出。 - Ben

-2

是的,你目前面临的问题是由于较旧的Django版本或复杂的“Depreciation”编写而导致的。

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

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

改为


{% load static %}

言归正传.. 只需要在您的BAse.html或任何类型的HTML文件中执行这些替换操作


1
你能否修正这个混乱的描述?我很难理解你的解释。请同时修正代码格式。请参见[答案]。 - Gander

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