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?

Sliljedal
quelle

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.

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

            }
    },
},

]]

Dat TT
quelle
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
Dadurch
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

Heapify
quelle
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 .

Shamsul Arefin Sajib
quelle
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.

Anish Ravula
quelle
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

Anupam
quelle
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.

Roddy P. Carbonell
quelle
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

anakyou
quelle
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.

Chris Shaw
quelle
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

Kiran Bachhav.
quelle
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.

Rahul Verma
quelle
-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

shomit
quelle
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