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?

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.


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

            }
    },
},

]


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


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.


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.


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


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


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.


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.


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


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


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.


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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.