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.