如何将Wagtail的“管理”菜单添加到自定义模板?

时间:2019-08-27 16:34:13

标签: django django-templates django-views wagtail

在源自Wagtail页面模型的模板上,右下角有一个小的Wagtail图标/菜单。这提供了编辑页面和/或跳转到Wagtail Admin的快速方法。但是,此菜单不会出现在并非源自Wagtail Page模型的自定义视图模板上。

如何告诉Wagtail在前端模板上显示小菜单,以便页面具有一致的导航?

1 个答案:

答案 0 :(得分:2)

标准的Wagtail用户栏通过放置在模板中来呈现:

{% load wagtailuserbar %}

{% wagtailuserbar 'top-left' %}

我通常将以上内容放在base.html中。当然,'top-left'的名称告诉模板标记在何处呈现用户栏。 Reference

但是,只为Wagtail页面呈现wagtailuserbar。您想要做的是仅使用Go to Wagtail Admin选项渲染用户栏(因为没有其他相关选项)。因此,您可以创建自己的模板标签,并将其放在base.html旁边的wagtailuserbar中。您将对其进行设置,以使其在上下文中没有page时呈现(wagtailuserbar模板标签检查以确保上下文中没有page)。要创建标签,只需从wagtailuserbar.py中的代码开始,然后对其进行修改以创建名为wagtailuserbar_admin_only(未经测试)的模板标签:

from django import template
from django.template.loader import render_to_string
from wagtail.admin.templatetags.wagtailuserbar import get_page_instance
from wagtail.admin.userbar import (AdminItem)

@register.simple_tag(takes_context=True)
def wagtailuserbar_admin_only(context, position='bottom-right'):
    # Find request object
    try:
        request = context['request']
    except KeyError:
        return ''

    # Don't render without a user because we can't check their permissions
    try:
        user = request.user
    except AttributeError:
        return ''

    # Don't render if user doesn't have permission to access the admin area
    if not user.has_perm('wagtailadmin.access_admin'):
        return ''

    # Only render if the context does NOT contain a variable referencing a saved page
    page = get_page_instance(context)
    if page:
        return ''

    # Render the items
    rendered_items = [AdminItem()]

    # Render the userbar items
    return render_to_string('wagtailadmin/userbar/base.html', {
        'request': request,
        'items': rendered_items,
        'position': position,
    })

然后,要在模板中使用,请放在base.html中:

{% load wagtailuserbar_admin_only %}

{% wagtailuserbar_admin_only 'top-left' %}