簡體   English   中英

如何為現有Django應用添加自定義標簽/過濾器?

[英]How to add a custom tag/filter to an existing Django app?

我必須改編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 %}該標簽,以向模板添加某些默認參數。 根據我了解的文檔 ,我將必須:

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的條目, vote.initproc假定正在加載所包含的templatetags(如警衛),我認為這不是必需的。

重新啟動服務器可以正常工作,但是當我加載頁面時,我得到TemplateSyntaxError: 'get_setting'. Did you forget to register or load this tag? TemplateSyntaxError: 'get_setting'. Did you forget to register or load this tag?

我嘗試將site_defaults添加到installed_apps和中間件中,但是會引發ModuleNotFoundError: No module named 'site_defaults'

Django文檔僅提及:

包含自定義標記的應用程序必須位於INSTALLED_APPS中,才能使{%load%}標記起作用。

但是我不知道如何正確添加它,所以問題是:如何正確地將自定義標簽/過濾器添加到現有的Django應用程序?

您正在注冊一個過濾器,但嘗試將其用作標記,並以“ site_defaults”名稱注冊它,並嘗試將其用作“ get_settings”。 您要在此處使用simple_tag ,並保留名稱:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM