Django 1.10.1 'my_templatetag' no es una biblioteca de etiquetas registrada. Debe ser uno de:

82

Quiero un menú personalizado según el grupo al que pertenece. Estoy usando Django 1.10.1, allauth y así sucesivamente. Cuando intento crear mi etiqueta de plantilla, falla y dice: ¨

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' se ve así:

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

y ese error viene en mi archivo .html que dice,

{%  load my_templatetag %}

Intenté reiniciar el servidor como millones de veces, también intenté cambiar todos los nombres y la aplicación es parte de INSTALLED_APPS en settings.py. ¿Qué estoy haciendo mal?

Sliljedal
fuente

Respuestas:

132

Además de poner my_templatetag.pyadentro app_name/templatetags, asegúrese de reiniciar el servidor de desarrollo de Django (o asegúrese de que se reinicie solo) cada vez que modifique las etiquetas de la plantilla. Si el servidor no se reinicia, Django no registrará las etiquetas.

lmiguelvargasf
fuente
8
¡Reiniciando el servidor! ¡Un millón de gracias!
FMCorz
2
Para mí era el __init__.py que faltaba en la carpeta templatetags ...
zypro
Por eso me encanta stackoverflow
Oto Shavadze
70

Desde django 1.9, puede cargar esas nuevas etiquetas / filtros en configuraciones como esta:

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
fuente
2
Muchas gracias por eso :) No se pudo hacer que funcionara al revés.
Jonathan
1
Funcionó para mí también. Esta podría ser la respuesta elegida para la pregunta. Estoy usando la versión 2.0 de django en caso de que la gente se lo pregunte.
RRC
esto me permitió usar la etiqueta personalizada para todo el proyecto
peligroso
esto también funciona si necesita sobrescribir etiquetas de plantilla específicas de un paquete de sitio
Nico M
Esta debería ser la respuesta: yo uso Django 3.x.
FearlessFuture
35

Asegúrese de no perderse ninguno de los siguientes pasos:

  1. Cree una carpeta llamada "templatetags" al mismo nivel que models.py y views.py en la carpeta de su aplicación

  2. Su aplicación debe estar en INSTALLED_APPS en settings.py

  3. La carpeta templatetags debe tener __init__.py

  4. Reinicia el servidor django

Amontonar
fuente
Me parece que todas mis aplicaciones requieren un apps.py e init .py para contener default_app_config = 'custom_admin.apps.Config'. De lo contrario, Django 1.10 no carga etiquetas de plantilla. Sin embargo, no veo esto explícitamente en los documentos.
Chris Sattinger
¡Gracias! Me había olvidado de agregar __ini__.py, pero ¿sabes por qué solía funcionar en Python3 pero no en Python2?
Farzad Abdolhosseini
2
¡Es el reinicio lo que me atrae cada vez! Gracias por recordármelo en # 4 ^^
Marc
El punto # 4 me ayudó a "Reiniciar el servidor Django", para que Django pueda identificar las nuevas etiquetas de plantilla.
Feras
21

En mi caso, el problema era que estaba usando {% load filter_method_name %}

Tuve que cambiar a {% load filename %}

Luego tuve que reiniciar el servidor.

Shamsul Arefin Sajib
fuente
2
Reinicie el servidor , una solución tan simple para un error molesto
Ahmed I. Elsayed
El nombre del archivo era el indicado para mí. ¡Gracias!
ravioles
@ravioli sí, algo muy sutil para notar
Shamsul Arefin Sajib
¡Gracias! Pasé por alto esto por completo, ya que había asumido que necesitaba cargar el método y no el módulo en sí.
Majestic Pixel
3

Reinicie el servidor django. Me funcionó después de configurar la carpeta templatetag dentro de la aplicación y template_name.py en la carpeta templatetag.

Anish Ravula
fuente
3

En caso de que ayude a alguien, el problema en mi caso fue que estaba usando comillas al intentar cargar la (s) etiqueta (s)

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

en vez de

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

Nota: extendsnecesita comillas alrededor del nombre del archivo, pero noload

Anupam
fuente
¡Este era mi problema!
elplatt
3

tienes que detener manualmente el servidor de desarrollo e iniciarlo de nuevo, para que Django pueda identificar las nuevas etiquetas de plantilla

anakyou
fuente
Esta pregunta ya tiene muchas respuestas, y esta publicación no agrega nada que no se haya dicho en otras respuestas.
Henry Woody
2

Estoy usando Django 1.11 y estaba teniendo el mismo problema. Algunas de las respuestas aquí son correctas, pero es posible que falten algunas cosas. Aquí esta lo que hice:

Citando a un usuario anterior:

Cree una carpeta llamada "templatetags" al mismo nivel que models.py y views.py en la carpeta de su aplicación

Su aplicación debe estar en INSTALLED_APPS en settings.py

La carpeta templatetags debe tener init .py

Pero, antes de reiniciar el servidor Django, agregue esto al archivo que contiene las etiquetas:

from django import template
register = template.Library()

Luego, puede reiniciar el servidor.

Roddy P. Carbonell
fuente
Esto funcionó para mí cuando usé ' init .py' en lugar de 'init.py'.
William
1

Sé que esto es un poco antiguo, pero hoy me encontré con el mismo problema. Encontré la solución en los documentos: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

La aplicación debe contener un directorio templatetags, al mismo nivel que models.py, views.py, etc. Si aún no existe, créelo; no olvide el archivo __init__.py para asegurarse de que el directorio se trate como un paquete de Python.

Simplemente copiando el __init__.py desde otra ubicación en el directorio de la nueva etiqueta de plantilla lo solucionó.

Chris Shaw
fuente
1

Resolví esto agregando una carpeta templatestag en la raíz con un archivo filter.py que define mis filtros, luego ajusté mi settings.py .

Verifique mi respuesta completa con respecto a este problema en este hilo similar

LucianoBAF
fuente
0

ponga my_templatetag.py dentro de app_name / templatetags y luego cree init .py dentro de app_name / templatetags .. Luego abra el terminal en la carpeta del proyecto y dé el comando python manage.py shell

de app_name.templatetags importar my_templatetag

Kiran Bachhav.
fuente
dentro de la carpeta templatetags cajón archivo en blanco con nombre init .py
Kiran Bachhav.
2
Por favor, editar su respuesta para poner todos los datos en él y darle formato a ser legible (utilice el código de formatear en su caso).
Melebio
0

simplemente corta / elimina el código que está escrito dentro de (ejemplo templatetags / home.py) de home.py, elimina tu código y reinicia tu servidor y vuelve a pegar tu código en home.py, funcionará.

Rahul Verma
fuente
0

Yah, este problema al que se enfrenta actualmente debido a la versión anterior de django o complejo para escribir "Depreciación"

si tiene estos tipos de etiquetas en su plantilla / archivos html, cámbielas con ..

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

cambiar con


{% load static %}

Vaya al grano .. JUst SIMPLEMENTE REALICE ESTOS Sustituya todos estos de SU BAse.html / o cualquier tipo de HTML

Ceniza
fuente
¿Puedes corregir esta desordenada descripción? Me cuesta entender tu explicación. También corrija el formato del código. Vea cómo responder
Gander
-1

en primer lugar, detenga el servidor, quite / corte el código de templatetags / tag.py y vuelva a escribirlo / péguelo, luego ejecute el servidor.

mierda
fuente
2
¿Cómo ayudará cortar y luego volver a pegar en el código? Si ve un error en el código de muestra de la pregunta, indíquelo.
Ben