如何将自定义标记/过滤器添加到现有的Django应用程序?

时间:2018-06-18 12:01:09

标签: python django templates django-templates

我必须调整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

settings.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)将模块添加到 templatetags ,所以我创建了

# /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)将模块添加到 settings.py 中的INSTALLED_APPS

但由于列表中已包含vote.initproc的条目,并且包含的​​模板标签(如后卫)正在加载,我认为这不是必需的。

重新启动服务器有效,但是当我加载页面时,我得到TemplateSyntaxError: 'get_setting'. Did you forget to register or load this tag?

我尝试将 site_defaults 添加到installed_apps和中间件,但它会抛出ModuleNotFoundError: No module named 'site_defaults'

Django docs仅提及:

  

包含自定义标记的应用必须位于INSTALLED_APPS中   命令{%load%}标记有效。

但是我对如何正确添加它感到很遗憾,所以问题是:如何正确地将自定义标记/过滤器添加到现有的Django应用程序中?

1 个答案:

答案 0 :(得分:3)

您正在注册过滤器,但尝试将其用作标记,并且您正在使用名称&#34; site_defaults&#34;进行注册。并尝试将其用作&#34; get_settings&#34;。你想在这里simple_tag,并保留名称:

@register.simple_tag
def get_setting(my_setting):
   # ...

https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#simple-tags

相关问题