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?

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.


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

            }
    },
},

]


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


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.


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.


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


¡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


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.


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ó.


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


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


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á.


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


¿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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.