Django 1.10.1 'my_templatetag' ist keine registrierte Tag-Bibliothek. Muss einer von sein:


80

Ich möchte ein benutzerdefiniertes Menü, je nachdem, welcher Gruppe Sie angehören. Ich benutze Django 1.10.1, allauth und so weiter. Wenn ich versuche, mein Templatetag zu erstellen, schlägt dies fehl und es heißt: ¨

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' sieht folgendermaßen aus:

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

und der Fehler kommt in meiner .html-Datei, die sagt,

{%  load my_templatetag %}

Ich habe wie millionenfach versucht, den Server neu zu starten, außerdem habe ich versucht, alle Namen zu ändern, und die App ist Teil von INSTALLED_APPS in settings.py. Was mache ich falsch?

Antworten:


126

Außerdem setzen my_templatetag.pyinnen app_name/templatetags, stellen Sie sicher , neu starten Sie den Django - Entwicklungsserver (oder sicherzustellen , dass es sich eingestellt) jedes Mal , wenn Template - Tags ändern. Wenn der Server nicht neu gestartet wird, registriert Django die Tags nicht.


8
Server neu starten! Tausend Dank!
FMCorz

2
Für mich war es die fehlende __init__.py im Templatetags-Ordner ...
Zypro

Deshalb liebe ich Stackoverflow
Oto Shavadze

68

Ab Django 1.9 können Sie diese neuen Tags / Filter in folgenden Einstellungen laden:

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
Vielen Dank dafür :) Konnte nicht anders funktionieren.
Jonathan

1
Es hat auch bei mir funktioniert. Dies könnte tatsächlich die gewählte Antwort auf die Frage sein. Ich benutze die 2.0-Version von Django, falls sich die Leute fragen.
RRC


Dies funktioniert auch, wenn Sie bestimmte Templatetags eines Site-Pakets überschreiben müssen
Nico M

Dies sollte die Antwort sein: Ich benutze Django 3.x.
FearlessFuture

35

Stellen Sie sicher, dass Sie keinen der folgenden Schritte verpassen:

  1. Erstellen Sie einen Ordner mit dem Namen "templatetags" auf derselben Ebene wie models.py und views.py in Ihrem Anwendungsordner

  2. Ihre Anwendung muss sich in INSTALLED_APPS in settings.py befinden

  3. Der Templatetags-Ordner muss __init__.py haben

  4. Starten Sie den Django-Server neu


Es scheint mir, dass alle meine Apps eine apps.py und eine init .py benötigen, um sie zu enthalten default_app_config = 'custom_admin.apps.Config'. Andernfalls lädt Django 1.10 keine Vorlagen-Tags. Ich sehe dies jedoch nicht explizit in den Dokumenten.
Chris Sattinger

Vielen Dank! Ich hatte vergessen hinzuzufügen __ini__.py, aber wissen Sie, warum es in Python3 funktioniert hat, aber nicht in Python2?
Farzad Abdolhosseini

2
Es ist der Neustart, der mich jedes Mal bringt! Vielen Dank für die Erinnerung an # 4 ^^
Marc

Punkt 4 hat mir geholfen, "den Django-Server neu zu starten", damit Django die neuen Vorlagen-Tags identifizieren kann.
Feras

20

In meinem Fall war das Problem, das ich benutzte {% load filter_method_name %}

Ich musste umziehen {% load filename %}

Ich musste dann den Server neu starten .


2
Starten Sie den Server neu . Eine so einfache Lösung für einen nervigen Fehler
Ahmed I. Elsayed

Der Dateiname war der richtige für mich. Vielen Dank!
Ravioli

@ravioli ja, eine wirklich subtile Sache zu bemerken
Shamsul Arefin Sajib

Vielen Dank! Ich habe dies völlig übersehen, da ich angenommen hatte, dass ich die Methode und nicht das Modul selbst laden musste.
Majestic Pixel


3

Starten Sie den Django-Server neu. Es funktionierte für mich, nachdem ich den Ordner templatetag in der App und template_name.py im Ordner templatetag festgelegt hatte.


3

Falls es jemandem hilft, bestand das Problem in meinem Fall darin, dass ich beim Laden der Tags Anführungszeichen verwendet habe.

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

anstatt

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

Hinweis: extendsBenötigt Anführungszeichen um den Dateinamen, aber nichtload


Das war mein Problem!
Elplatt

2

Ich verwende Django 1.11 und hatte das gleiche Problem. Einige der Antworten hier sind richtig, aber einige Dinge fehlen möglicherweise. Folgendes habe ich getan:

Einen vorherigen Benutzer zitieren:

Erstellen Sie einen Ordner mit dem Namen "templatetags" auf derselben Ebene wie models.py und views.py in Ihrem Anwendungsordner

Ihre Anwendung muss sich in INSTALLED_APPS in settings.py befinden

Der Templatetags-Ordner muss init .py haben

Bevor Sie den Django-Server neu starten, fügen Sie dies der Datei hinzu, die die Tags enthält:

from django import template
register = template.Library()

Dann können Sie den Server neu starten.


Dies funktionierte bei mir, als ich ' init .py' anstelle von 'init.py' verwendete.
William

2

Sie müssen den Entwicklungsserver manuell stoppen und erneut starten, damit Django die neuen Vorlagen-Tags identifizieren kann


Diese Frage hat bereits viele Antworten, und dieser Beitrag fügt nichts hinzu, was in anderen Antworten nicht gesagt wurde.
Henry Woody

1

Ich weiß, dass dies ein bisschen alt ist, aber ich bin heute auf das gleiche Problem gestoßen. Ich habe die Lösung in den Dokumenten gefunden: https://docs.djangoproject.com/de/dev/howto/custom-template-tags/

Die App sollte ein Templatetags-Verzeichnis auf derselben Ebene wie models.py, views.py usw. enthalten. Wenn dies noch nicht vorhanden ist, erstellen Sie es. Vergessen Sie nicht die Datei __init__.py, um sicherzustellen, dass das Verzeichnis als behandelt wird ein Python-Paket.

Durch einfaches Kopieren der Datei __init__.py von einem anderen Speicherort in das Verzeichnis des neuen Vorlagen-Tags wurde sie sortiert.


0

Fügen Sie my_templatetag.py in app_name / templatetags ein und erstellen Sie init .py in app_name / templatetags. Öffnen Sie dann das Terminal im Projektordner und geben Sie den Befehl python manage.py shell

aus app_name.templatetags importiere my_templatetag


in Templatetags Ordner Kiste leere Datei mit dem Namen init .py
Kiran Bachhav.

2
Bitte bearbeiten Sie Ihre Antwort , um alle Details darin abzulegen und sie so zu formatieren, dass sie lesbar sind (verwenden Sie gegebenenfalls die Code-Formatierung).
Melebius

0

Sie schneiden / entfernen einfach Ihren Code, der in der (Beispiel-Templatetags / home.py) von home.py geschrieben ist. Sie entfernen Ihren Code und starten Ihren Server neu und fügen Ihren Code erneut in home.py ein. Es wird funktionieren.


-1

Stoppen Sie zuerst den Server. Entfernen / schneiden Sie den Code aus templatetags / tag.py und schreiben Sie ihn neu / fügen Sie ihn ein. Führen Sie dann den Server aus. Es hat bei mir funktioniert


2
Wie hilft das Ausschneiden und anschließende Einfügen in den Code? Wenn im Beispielcode der Frage ein Fehler auftritt, weisen Sie darauf hin.
Ben
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.