我目前正在编写一些自定义模板标签但由于某种原因它们无法加载。我的目录结构如下:
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
答案 0 :(得分:15)
,你永远不应该明确地命名项目'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)
一些原因:
例如#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
,那么您应该没问题。