Django 1.10.1 my_templatetag не является зарегистрированной библиотекой тегов. Должен быть одним из:


82

Я хочу, чтобы меню было индивидуальным, в зависимости от того, членом какой группы вы являетесь. Я использую 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 %}

Я пытался перезапустить сервер миллионы раз, также я пытался изменить все имена, а приложение является частью INSTALLED_APPS в settings.py. Что я делаю неправильно?

Ответы:


132

Помимо помещения my_templatetag.pyвнутрь app_name/templatetags, убедитесь, что вы перезапускаете сервер разработки Django (или убедитесь, что он перезапускается сам) каждый раз, когда вы изменяете теги шаблона. Если сервер не перезагружается, Django не регистрирует теги.


8
Перезагружаем сервер! Бесконечно благодарен!
FMCorz

2
Для меня это был отсутствующий __init__.py в папке templatetags ...
zypro

Вот почему я люблю stackoverflow
Ото Шавадзе

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

Это должно быть ответом: я использую Django 3.x.
FearlessFuture

35

Убедитесь, что вы не пропустите ни одного из следующих шагов:

  1. Создайте папку с названием "templatetags" на том же уровне, что и models.py и views.py в папке вашего приложения.

  2. Ваше приложение должно быть в INSTALLED_APPS в settings.py

  3. В папке templatetags должен быть __init__.py

  4. Перезагрузите сервер django


Мне кажется, что все мои приложения требуют, чтобы файлы apps.py и init .py содержали default_app_config = 'custom_admin.apps.Config'. В противном случае Django 1.10 не загружает теги шаблонов. Однако я не вижу этого явно в документации.
Крис Саттингер

Благодаря! Я забыл добавить __ini__.py, но знаете ли вы, почему раньше он работал на Python3, а не на Python2?
Фарзад Абдольхоссейни

2
Это перезагрузка, которая меня достает каждый раз! Спасибо, что напомнили мне о # 4 ^^
Marc

Пункт №4 помог мне «Перезапустить сервер Django», чтобы Django мог идентифицировать новые теги шаблона.
Feras

21

В моем случае проблема заключалась в том, что я использовал {% load filter_method_name %}

Мне пришлось сменить на {% load filename %}

Затем мне пришлось перезапустить сервер.


2
Перезагрузите сервер , такое простое решение для досадной ошибки
Ахмед И. Эльсайед

Имя файла было для меня единственным. Благодаря!
равиоли

@ravioli да, это действительно тонкая вещь,
которую стоит

Спасибо! Я полностью упустил это из виду, так как предполагал, что мне нужно загрузить метод, а не сам модуль.
Majestic Pixel


3

Перезагрузите сервер django. У меня это сработало после установки папки templatetag в приложении и template_name.py в папке templatetag.


3

Если это кому-то помогает, проблема в моем случае заключалась в том, что я использовал кавычки при попытке загрузить тег (ы)

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

вместо

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

Примечание: extendsнеобходимо заключить имя файла в кавычки, но неload


Это была моя проблема!
elplatt

3

вам нужно вручную остановить сервер разработки и запустить его снова, чтобы Django мог идентифицировать новые теги шаблона


На этот вопрос уже есть много ответов, и этот пост не добавляет ничего, что не было сказано в других ответах.
Генри Вуди

2

Я использую Django 1.11, и у меня была такая же проблема. Некоторые ответы здесь верны, но некоторых вещей может не хватать. Вот что я сделал:

Цитата предыдущего пользователя:

Создайте папку с названием "templatetags" на том же уровне, что и models.py и views.py в папке вашего приложения.

Ваше приложение должно быть в INSTALLED_APPS в settings.py

В папке 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/

Приложение должно содержать каталог templatetags на том же уровне, что и models.py, views.py и т. Д. Если он еще не существует, создайте его - не забудьте файл __init__.py, чтобы убедиться, что каталог обрабатывается как пакет Python.

Простое копирование __init__.py из другого места в каталог нового templatetag поможет разобраться.


1

Я решил это, добавив папку templatestag в корень с файлом filter.py, определяющим мои фильтры, затем я настроил свой settings.py .

Пожалуйста, проверьте мой полный ответ по этой проблеме в этой же теме.


0

поместите my_templatetag.py внутри app_name / templatetags, затем создайте init .py внутри app_name / templatetags .. Затем откройте терминал в папке проекта и дайте команду python manage.py shell

from app_name.templatetags import my_templatetag


внутри папки templatetags crate пустой файл с именем init .py
Kiran Bachhav.

2
Пожалуйста редактировать свой ответ , чтобы поместить все детали в нем и отформатировать его , чтобы быть читаемыми (используйте форматирование кода , где это уместно).
Мелебиус

0

вы просто вырезаете / удаляете свой код, который написан внутри (пример templatetags / home.py) из home.py, вы удаляете свой код и перезапускаете сервер и снова вставляете свой код в home.py, он будет работать.


0

Да, эта проблема, с которой вы сейчас столкнулись, из-за более старой версии django или сложно написать «Амортизация»

Если в вашем шаблоне / HTML-файлах есть эти типы тегов, измените их с помощью ..

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

изменить с


{% load static %}

Ближе к делу .. Просто выполните эти действия. Замените все это из нашего BAse.html / или любого типа HTML.


Вы можете исправить это запутанное описание? Мне трудно понять ваше объяснение. Также исправьте форматирование кода. Смотрите, как ответить
Гандер

-1

сначала остановите сервер. удалите / вырежьте код из templatetags / tag.py и перепишите / вставьте его. затем запустите сервер. это сработало для меня


2
Как поможет вырезание, а затем вставка в код? Если вы видите ошибку в образце кода вопроса, укажите на нее.
Бен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.