Django 1.10.1 „my_templatetag” nie jest zarejestrowaną biblioteką tagów. Musi być jednym z:

82

Chcę menu, które jest niestandardowe w zależności od tego, do której grupy należysz. Używam Django 1.10.1, allauth i tak dalej. Kiedy próbuję utworzyć mój szablon szablonu, kończy się to niepowodzeniem i jest na nim napis: ¨

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” wygląda następująco:

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()

a błąd pojawia się w moim pliku .html, który mówi:

{%  load my_templatetag %}

Próbowałem zrestartować serwer miliony razy, próbowałem też zmienić wszystkie nazwy, a aplikacja jest częścią INSTALLED_APPS w settings.py. Co ja robię źle?

Sliljedal
źródło

Odpowiedzi:

133

Oprócz umieszczania my_templatetag.pywewnątrz app_name/templatetags, upewnij się, że restartujesz serwer deweloperski Django (lub upewnij się, że sam się restartuje) za każdym razem, gdy modyfikujesz tagi szablonu. Jeśli serwer się nie zrestartuje, Django nie zarejestruje tagów.

lmiguelvargasf
źródło
8
Restartowanie serwera! Stukrotne dzięki!
FMCorz
2
Dla mnie był to brakujący __init__.py w folderze templatetags ...
zypro
Dlatego uwielbiam stackoverflow
Oto Shavadze
70

Od wersji django 1.9 możesz załadować te nowe tagi / filtry w takich ustawieniach:

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',

            }
    },
},

]

Dat TT
źródło
2
Wielkie dzięki za to :) Nie mogłem zmusić tego do działania w inny sposób.
Jonathan
1
U mnie też się udało. W rzeczywistości może to być wybrana odpowiedź na pytanie. Używam wersji 2.0 django na wypadek, gdyby ludzie się zastanawiali.
RRC
pozwoliło mi to na użycie niestandardowego tagu dla całego projektu
dangel
działa to również, jeśli chcesz nadpisać określone tagi szablonów pakietu witryny
Nico M
To powinna być odpowiedź: używam Django 3.x.
FearlessFuture
35

Upewnij się, że nie brakuje żadnego z następujących kroków:

  1. Utwórz folder o nazwie „templatetags” na tym samym poziomie co modeles.py i views.py w folderze aplikacji

  2. Twoja aplikacja musi znajdować się w INSTALLED_APPS w settings.py

  3. Folder templatetags musi mieć __init__.py

  4. Zrestartuj serwer django

Heapify
źródło
Wydaje mi się, że wszystkie moje aplikacje wymagają plików apps.py i init .py default_app_config = 'custom_admin.apps.Config'. W przeciwnym razie Django 1.10 nie ładuje templatetags. Nie widzę tego wyraźnie w dokumentach.
Chris Sattinger,
Dzięki! Zapomniałem dodać __ini__.py, ale czy wiesz, dlaczego kiedyś działało w Python3, ale nie w Python2?
Farzad Abdolhosseini,
2
Za każdym razem dostaje mnie restart! Dzięki za przypomnienie mi o # 4 ^^
Marc
Punkt 4 pomógł mi „Zrestartować serwer Django”, dzięki czemu Django może zidentyfikować nowe znaczniki szablonu.
Feras,
21

W moim przypadku problem polegał na tym, że używałem {% load filter_method_name %}

Musiałem się zmienić {% load filename %}

Następnie musiałem zrestartować serwer.

Shamsul Arefin Sajib
źródło
2
Zrestartuj serwer , takie proste rozwiązanie irytującego błędu
Ahmed I. Elsayed
Nazwa pliku była odpowiednia dla mnie. Dzięki!
ravioli
@ravioli tak, naprawdę subtelna rzecz do zauważenia
Shamsul Arefin Sajib
Dziękuję Ci! Całkowicie to przeoczyłem, ponieważ założyłem, że muszę załadować metodę, a nie sam moduł.
Majestic Pixel
3

Zrestartuj serwer django. U mnie zadziałało po ustawieniu folderu templatetag w aplikacji i template_name.py w folderze templatetag.

Anish Ravula
źródło
3

Na wypadek, gdyby to komuś pomogło, problem w moim przypadku polegał na tym, że próbowałem załadować tag (y)

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

zamiast

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

Uwaga: extendswymaga cudzysłowów wokół nazwy pliku, ale nieload

Anupam
źródło
To był mój problem!
elplatt
3

musisz ręcznie zatrzymać serwer deweloperski i uruchomić go ponownie, aby Django mógł zidentyfikować nowe znaczniki szablonu

anakyou
źródło
To pytanie ma już wiele odpowiedzi, a ten post nie dodaje niczego, co nie zostało powiedziane w innych odpowiedziach.
Henry Woody
2

Używam Django 1.11 i miałem ten sam problem. Niektóre odpowiedzi są prawidłowe, ale niektórych może brakować. Oto co zrobiłem:

Cytując poprzedniego użytkownika:

Utwórz folder o nazwie „templatetags” na tym samym poziomie co modeles.py i views.py w folderze aplikacji

Twoja aplikacja musi znajdować się w INSTALLED_APPS w settings.py

Folder templatetags musi mieć plik init .py

Ale zanim ponownie uruchomisz serwer Django, dodaj to do pliku zawierającego tagi:

from django import template
register = template.Library()

Następnie możesz ponownie uruchomić serwer.

Roddy P. Carbonell
źródło
To zadziałało, gdy użyłem „ init .py” zamiast „init.py”.
William
1

Wiem, że to trochę stare, ale dzisiaj napotkałem ten sam problem. Rozwiązanie znalazłem w dokumentach: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Aplikacja powinna zawierać katalog templatetags na tym samym poziomie co models.py, views.py itp. Jeśli jeszcze nie istnieje, utwórz go - nie zapomnij o pliku __init__.py, aby upewnić się, że katalog jest traktowany jako pakiet Pythona.

Po prostu skopiowanie __init__.py z innej lokalizacji do katalogu nowego szablonu templatetag rozwiązało problem.

Chris Shaw
źródło
1

Rozwiązałem to, dodając folder templatestag w katalogu głównym z plikiem filter.py definiującym moje filtry, a następnie dostosowałem ustawienia settings.py .

Proszę sprawdzić moją pełną odpowiedź dotyczącą tego problemu w tym podobnym wątku

LucianoBAF
źródło
0

umieść my_templatetag.py w app_name / templatetags, a następnie utwórz init .py w app_name / templatetags .. Następnie otwórz terminal w folderze projektu i wydaj polecenie python manage.py shell

z app_name.templatetags importuj my_templatetag

Kiran Bachhav.
źródło
wewnątrz skrzynki folderu templatetags pusty plik o nazwie init .py
Kiran Bachhav.
2
Proszę edytować odpowiedź umieścić wszystkie dane do niego i go sformatować być czytelny (formatowanie kodu użycie w razie potrzeby).
Melebius
0

po prostu wycinasz / usuwasz kod, który został zapisany w (przykład templatetags / home.py) z home.py usuwasz kod i restartujesz serwer i ponownie wklejasz kod w home.py, to zadziała.

Rahul Verma
źródło
0

Tak, ten problem, z którym się obecnie borykasz, spowodowany starszą wersją django lub napisanie "Amortyzacja"

Jeśli masz te typy znaków w swoim szablonie / plikach HTML, zmień je za pomocą ...

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

zamienić z


{% load static %}

Przejdź do sedna sprawy ... Po prostu wykonaj te czynności Zastąp wszystkie te z TWOJEGO BAse.html / lub dowolnego typu kodu HTML

Popiół
źródło
Czy możesz poprawić ten niechlujny opis? Trudno mi zrozumieć twoje wyjaśnienie. Popraw także formatowanie kodu. Zobacz, jak odpowiedzieć
Gander
-1

najpierw zatrzymaj serwer. usuń / wytnij kod z templatetags / tag.py i przepisz / wklej go. następnie uruchom serwer. zadziałało dla mnie

cholera
źródło
2
W jaki sposób pomoże wycinanie, a następnie wklejanie w kodzie? Jeśli zauważysz błąd w przykładowym kodzie pytania, wskaż go.
Ben