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

Posted

技术标签:

【中文标题】加载自定义模板标签时出现问题(错误:没有名为 x 的模块)【英文标题】:Problem loading custom template tags (Error: No module named x) 【发布时间】:2010-12-01 19:40:36 【问题描述】:

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

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

【问题讨论】:

您可以查看 [this][1] 了解更多可以帮助您的详细信息 [1]:***.com/questions/8607544/… 【参考方案1】:

settings.py 中,您永远不应该明确地将项目命名为“myproj”。在INSTALLED_APPS 中,只需使用“myapp”。另外,你应该有这个:

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

并确保在myapp 文件夹和templatetags 中都有一个__init__.py

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

另外,请确保 myapp_tags.py 文件名不会与您项目中的另一个文件夹/文件冲突。

希望这会有所帮助。

【讨论】:

+1 - 你刚刚从我办公室的空中旅行中拯救了我的电脑。赞赏。 这仍然与 Django 1.8 相关吗? @Pureferret for Django 1.8 看看这个:docs.djangoproject.com/en/1.8/ref/templates/upgrading 你需要在你的设置中添加模板目录。我刚碰到这个。【参考方案2】:

让我感到困惑的一件事是magic importing of templatetags 绕过了开发服务器的自动重新加载。 如果以下工作在manage.py shell

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

然后一切正常,您只需要重新加载开发服务器。另一方面,如果你得到一个ImportError,那么你应该检查你的INSTALLED_APPS,你有一个 __init__.py 文件在 templatetags 目录和所有其他建议的东西其他答案。

这可能只适用于遇到模板标签加载问题的一小部分人,但这是我在数周内第二次遇到这个问题,两次都是重新启动开发服务器让事情顺利进行。

【讨论】:

谢谢,这是我的问题 - 把我的头发拉出来了! 请投票一千次,这就是解决方案!【参考方案3】:

一些原因:

    由于 templatetgs 代码中的错误。 如果您在模板标签中使用了模型导入

例如对于#2。如果你正在做:

from your_app2.models import model

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

from your_project.your_app2.models import model

我就是这样工作的。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

问题是nyapp_tags 不在已安装项目的顶层。如果你把myproj.myapp.templatetags 放在INSTALLED_APPS 中,应该没问题。

【讨论】:

INSTALLED_APPS 不是sys.pathmyproj.myapp.templatetags 不是有效的应用程序。 嗨,这似乎有效。虽然这是一个错误?或者这是它应该如何工作?从文档中,我了解到 django 会遍历已安装的应用程序并在任何已安装的应用程序中查找名为“templatetags”的目录。因此,您不必专门添加它! 伊西,你是对的。您不应该将 templatetags 文件夹放在 python 路径上。通常,如果找不到模板标记,则会发生导入错误 - 但从您的代码中似乎并不明显(可能是循环导入?)

以上是关于加载自定义模板标签时出现问题(错误:没有名为 x 的模块)的主要内容,如果未能解决你的问题,请参考以下文章

为啥在运行玩笑测试时出现“未定义:x:y:属性”缺失错误?

尝试使用自定义图标创建 TabBarIOS 时出现不变违规错误

Jinja - 加载自定义模板标签集

使用 <@s.generator 和迭代器标签时出现“Freemarker 模板错误”

使用冒号加载标签时出现 Pig xmlloader 错误

Django:'tag'不是注册的标签库错误