我必须调整一个django应用程序(第一次使用django),并且我遇到了让自定义标记/过滤器工作的问题。我正在使用的应用程序具有以下结构:
tool
|- manage.py
|- templates
|- ...
|- vote
|- initadmin
|- initproc
|- templatetags
| __init__.py
| guard.py
|- __init__.py
|- apps.py
|- models.py
|- views.py
|- __init__.py
|- urls.py
|- settings.py
|- __pycache__
|- wsgi.py
在
设置Py
我安装的应用程序包含:
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.sites',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.postgres',
# 3rd party
...
# must be before admin ...
'django.contrib.admin',
# locally
'vote.initadmin',
'vote.initproc',
]
我想添加一个自定义标记,可以从模板中加载
{% load site_defaults %}
将某些默认参数添加到模板。从
docs
我明白,我必须:
1)将模块添加到
模板标记
,所以我创造了
# /vote/initproc/templatetags/site_defaults.py
import os
from django.conf import settings
from django import template
from six.moves import configparser
site_parser = configparser.ConfigParser()
site_parser.read(os.path.join(settings.BASE_DIR, "init.ini"))
register = template.Library()
@register.filter(name='site_defaults')
def get_setting(my_setting):
return site_parser.get("settings", my_setting)
2)将其加载到模板中并调用我的方法,例如:
{% load static %}
{% load i18n %}
{% load site_defaults %}
<!DOCTYPE html>
<html lang="{% get_setting DEFAULT_LANGUAGE %}">
...
3)将模块添加到
INSTALLED_APPS
在里面
设置Py
但是由于列表中已经包含了
vote.initproc
所包含的模板标记(如guard)正在进行异常加载,我认为这不是必需的。
重新启动服务器可以工作,但是当我加载一个页面时
TemplateSyntaxError: 'get_setting'. Did you forget to register or load this tag?
.
我试着把我的
站点默认值
安装的应用程序和中间件,但是
ModuleNotFoundError: No module named 'site_defaults'
这个
Django docs
仅提及:
包含自定义标记的应用必须位于
{%load%}标记工作的顺序。
但我不知道如何正确地添加它,所以问题是:如何正确地向现有的django应用程序添加自定义标记/过滤器?