加载自定义模板标记时出错(错误:没有名为x的模块)

时间:2009-09-27 16:50:36

标签: django django-templates django-custom-tags

我目前正在编写一些自定义模板标签但由于某种原因它们无法加载。我的目录结构如下:

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

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

在settings.py

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

在模板中

{% load myapp_tags %}

尝试加载页面时出现的错误:

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

5 个答案:

答案 0 :(得分:15)

settings.py

,你永远不应该明确地命名项目'myproj'。在INSTALLED_APPS中,只需使用“myapp”即可。另外,你应该这样:

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

确保__init__.py文件夹和myapp中都有templatetags

使用manage.py shell然后from myapp.templatetags import myapp_tags查看 myapp_tags.py 文件中是否存在任何python错误。

另外,请确保 myapp_tags.py 文件名与项目中的其他文件夹/文件不冲突。

希望这会有所帮助。

答案 1 :(得分:14)

让我感到震惊的一件事是magic importing of templatetags绕过了开发服务器的自动重新加载。 如果以下内容适用于manage.py shell

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

然后一切正常工作,您只需要重新加载开发服务器。另一方面,如果你得到一个ImportError则出现问题,你应该检查你的INSTALLED_APPS,你在templatetags目录中有一个 __ init __。py 文件,所有的其他答案中建议的其他事项。

这可能只适用于遇到模板标记加载问题的人中的一小部分,但这是我第二次在很长一段时间内得出这个问题而且两次都只是重新启动开发服务器把事情搞定。

答案 2 :(得分:2)

一些原因:

  1. 由于templatetgs代码中的错误。
  2. 如果您在templatetags中使用了模型导入
  3. 例如#2。如果你这样做:

    from your_app2.models import model
    

    这样会出错,所以在上面,你应该做

    from your_project.your_app2.models import model
    

    这对我有用。

答案 3 :(得分:0)

我刚刚在Django 2中遇到了同样的问题,并且意识到自定义模板标签文件在所有项目应用中必须具有唯一的名称。

答案 4 :(得分:-3)

问题是nyapp_tags不在安装项目的顶层。如果您将myproj.myapp.templatetags放入INSTALLED_APPS,那么您应该没问题。