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

Posted

技术标签:

【中文标题】如何将自定义标签/过滤器添加到现有的 Django 应用程序?【英文标题】:How to add a custom tag/filter to an existing Django app? 【发布时间】:2018-11-27 06:38:51 【问题描述】:

我必须调整一个 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】:

您正在注册一个过滤器,但试图将其用作标签,并且您正在以“site_defaults”的名称注册它并尝试将其用作“get_settings”。你想在这里simple_tag,别管名字:

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

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

【讨论】:

以上是关于如何将自定义标签/过滤器添加到现有的 Django 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 AxisItem 添加到现有的 PlotWidget?

将自定义html添加到django中的choicefield标签

如何将 qml ScatterSeries 添加到现有的 qml 定义的 ChartView?

如何将自定义模型添加到 django celery

将 XSLT 中的新类添加到现有的 div 标签类?

Django Allauth - 如何将自定义 CSS 类添加到字段?