代码之家  ›  专栏  ›  技术社区  ›  frequent

如何向现有django应用程序添加自定义标记/筛选器?

  •  0
  • frequent  · 技术社区  · 6 年前

    我必须调整一个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应用程序添加自定义标记/过滤器?

    1 回复  |  直到 6 年前
        1
  •  3
  •   bruno desthuilliers    6 年前

    您正在注册一个筛选器,但试图将其用作标记,并以“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