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.