2009-09-27 6 views
10

Actualmente estoy escribiendo algunas etiquetas de plantilla personalizadas, pero por alguna razón no se cargarán. Mi estructura de directorios es la siguiente:Problema al cargar etiquetas de plantilla personalizadas (Error: ningún módulo llamado x)

MyProj 
| 
----MyApp 
    | 
    |----templatetags 
      | 
      |----myapp_tags.py 
      |----__init__.py 

En myapp_tags.py

from django.template import Library, Node 
from myproj.myapp.models import Product 

register = Library() 

class LatestProductsNode(Node): 
    def render(self, context): 
     context['recent_products'] = Product.objects.all()[:5] 
     return '' 

def get_latest_products(parser, token): 
    return LatestProductsNode() 

get_latest_products = register.tag(get_latest_products) 

En settings.py

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.admin', 
    'myproj.myapp', 
) 

en la plantilla

{% load myapp_tags %} 

El error que consigo al intentar cargar la página:

Exception Type:  TemplateSyntaxError Exception Value:  

'myapp_tags' is not a valid tag library: Could not load template library from django.templatetags.myapp_tags, No module named myapp_tags 
+0

se puede comprobar [esto] [1] que tiene más detalles que le ayudarán a [1]: http://stackoverflow.com/questions/8607544/django-could-not-load-template -tag/21588173 # 21588173 – msoliman

Respuesta

15

en settings.py, nunca debe nombrar explícitamente el proyecto 'myproj'. En INSTALLED_APPS, simplemente use 'myapp'. Además, usted debe tener presente:

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.load_template_source', 
) 

y asegúrese de tener un __init__.py en la carpeta myapp así como en templatetags.

Uso manage.py shellfrom myapp.templatetags import myapp_tags entonces a preguntar si hay algún error en el archivo de pitón myapp_tags.py.

Además, asegúrese de que myapp_tags.py nombre de archivo no entra en conflicto con otra carpeta/archivo en su proyecto.

Espero que esto ayude.

+6

+1 - Acaba de guardar mi computadora de un viaje nacido en el aire a través de mi oficina. Apreciado. –

+0

¿Sigue siendo relevante para Django 1.8? – Pureferret

+1

@Pureferret para Django 1.8 eche un vistazo a esto: https: //docs.djangoproject.com/en/1.8/ref/templates/upgrading/ necesita agregar directorios de plantilla en su configuración. Me encontré con esto. – pixelrevision

-3

El problema es que no es nyapp_tags en el nivel superior de un proyecto instalado. Si coloca myproj.myapp.templatetags en INSTALLED_APPS, debería estar bien.

+0

'INSTALLED_APPS' no es' sys.path', 'myproj.myapp.templatetags' no es una aplicación válida. –

+0

Hola, parece que funciona. Aunque es esto un error? o es así como se supone que funciona? De la documentación entiendo que django recorre las aplicaciones instaladas y busca un directorio llamado 'templatetags' en cualquiera de las aplicaciones instaladas. ¡Por lo tanto, no debería tener que agregar esto específicamente! – ismail

+0

Emisión, estás en lo correcto. No debe colocar la carpeta templatetags en la ruta de Python. A menudo, si no se puede encontrar la etiqueta de la plantilla, se produce un error de importación, pero no parece obvio desde su código (¿quizás una importación circular?) – SmileyChris

13

Una cosa que me ha molestado es que el magic importing of templatetags omite la recarga automática del servidor de desarrollo. Si las siguientes obras en manage.py shell

>>> from django.templatetags import myapp_tags 
>>> 

entonces todo está trabajando realmente y sólo tiene que volver a cargar el servidor de desarrollo. Si, por otro lado, obtienes un ImportError, entonces algo está mal y deberías verificar tu INSTALLED_APPS, que tienes un archivo __init__.py en el directorio templatetags y todas las otras cosas sugeridas en las otras respuestas.

Esto probablemente solo se aplique a una pequeña fracción de las personas que experimentan problemas de carga de etiquetas de plantilla, pero esta es la segunda vez que llegué a esta pregunta en tantas semanas y en ambas ocasiones reinicié el servidor de desarrollo para hacer que las cosas funcionen

+2

Gracias, este fue mi problema, ¡estaba tirando de mi cabello! –

+0

Lo mismo para mí, gracias! – dragoon

+0

oh hombre ... Pasé 20 minutos como un idiota y fue este –

2

Algunas razones:

  1. debido a un error en el código de templatetgs.
  2. Si ha utilizado modelo importación en templatetags

Para # 2, por ejemplo. Si usted está haciendo:

from your_app2.models import model 

Esto va a salir mal, así que en vez arriba, se debe hacer

from your_project.your_app2.models import model 

Me funcionó de esta manera.

Cuestiones relacionadas