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

це також працює, якщо вам потрібно перезаписати певні теги шаблонів пакета сайтів
— Ніко М

Це має бути відповідь: я використовую 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
Це перезапуск, який отримує мене кожного разу! Thx за нагадування мені №4 ^^
— Марк,

Точка №4 допомогла мені "Перезапустити сервер Django", щоб Django міг ідентифікувати нові теги шаблону.
— Ферас,

21

У моєму випадку проблема полягала в тому, що я використовував {% load filter_method_name %}

Мені довелося переодягнутися в {% load filename %}

Потім мені довелося перезапустити сервер.


2
Перезапустіть сервер , таке просте рішення для настирливої ​​помилки
— Ahmed I. Elsayed

Назва файлу була однією для мене. Дякую!
— равіолі

@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

з app_name.templatetags імпортувати my_templatetag


всередині папки templatetags
— обробляйте

2
Будь ласка, відредагуйте свою відповідь, щоб додати до неї всі деталі та відформатувати її для читання (використовуйте форматування коду, де це доречно).
— Мелебій

0

Ви просто вирізаєте / видаляєте свій код, який написаний у (example 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 і перепишіть / вставте. потім запустіть server.it працював у мене


2
Як допоможе вирізання, а потім вставлення назад у код? Якщо ви бачите помилку у зразку коду запитання, вкажіть її.
— Бен,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.