wagteil django 自定义模板标签使用

Published on Aug. 22, 2023, 12:11 p.m.

wagteil片段是不需要呈现完整网页的内容片段。它们可用于制作可在 Wagtail 管理员中编辑的次要内容,例如页眉、页脚和侧边栏。片段是不继承Page类的 Django 模型,因此没有组织到 Wagtail 树中。但是,它们仍然可以通过分配面板并使用register_snippet类装饰器将模型标识为片段来使其可编辑。

  1. 在应用目录下创建 templatetags目录(与 templates 目录同级,目录名只能是 templatetags)。
HelloWorld/
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
        |-- templatetags
        |       -- node**_tags.py**
        |-- templates

...
|-- manage.py

  1. templatetags 目录下创建任意 py 文件,如:node_tags.py
  2. node_tags.py 文件代码如下:
import datetime
import os.path
from django import template
from django.utils.safestring import mark_safe
from node.models import Advert

register = template.Library()   #register的名字是固定的,不可改变

#使用绝对路径可用
# @register.inclusion_tag('/home/terry/PycharmProjects/django-mongodb/mysite/node/templates/node/adverts.html', takes_context=True)

#测试相对路径
# @register.inclusion_tag(os.path.join('node/templates/node/adverts.html'), takes_context=True)
@register.inclusion_tag(os.path.join('adverts.html'), takes_context=True)
def adverts(context):
    return {
        'adverts': Advert.objects.all(),
        'request': context['request'],
        'qq': context['request'],
    }

至于adverts.html模板文件

#adverts.html

TemplateDoesNotExist错误

Django Version: 4.0
Exception Type: TemplateDoesNotExist
Exception Value:

adverts.html

核心问题就是模板路径问题,

  • 使用绝对路径可用
  • 使用**@register.inclusion_tag**(**'app/adverts.html'**, takes_context=True)

参考链接:

Django inclusion tag takes_context TemplateDoesNotExist error

  1. (可选)wagteil中不需要修改,如果默认的可用修改 settings.py 文件的 TEMPLATES 选项配置,添加 libraries 配置:
#settings.py 配置文件
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, "/templates",],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            "libraries":{                          # 添加这边三行配置
                'node_tags':'templatetags.node_tags'   # 添加这边三行配置        
            }                                      # 添加这边三行配置
        },
    },
]
  1. 模板中引用

{% load wagtailcore_tags %}

# 添加
{% load wagtailcore_tags node_tags %}

# 引用内容
{% adverts %}

参考链接

Snippets - Wagtail Documentation 3.0 documentation

Snippets - Wagtail Documentation 3.0 documentation

Django 模板

Django基础(16): 模板标签(tags)的介绍及如何自定义模板标签