【问题标题】:How to generate a custom link in Wagtail using Wagtail hooks如何使用 Wagtail 钩子在 Wagtail 中生成自定义链接
【发布时间】:2019-09-03 14:44:12
【问题描述】:

所以我想在 Wagtail 管理员中添加一个额外的链接。我正在关注文档 (Register Admin Menu Item Hook) 并使用这个钩子来构建一个新的菜单项。

他们使用这个钩子来添加菜单项:

@hooks.register('register_admin_menu_item')
def register_edit_menu_item():
    return MenuItem('Edit profile', 'edit_link', classnames='icon icon-folder-inverse', order=10000)

这应该成为开始编辑当前登录用户拥有的页面的链接。在模板中,我使用此代码创建直接链接以编辑用户的个人资料:

{% with request.user.owned_pages.all as pages %}
   {% if pages.exists %}
      {% for p in pages %}
         {% if p.get_parent.id == 17 %}
         <a class="list-group-item" href="/dashboard/pages/{{ p.id }}/edit/"><i class="fe-icon-edit mr-1 text-muted"></i>Edit profile</a>
         {% endif %}
      {% endfor %}
   {% endif %}
{% endwith %}

这工作得很好,它直接链接到它应该链接到的页面。但是,如何实现这样的条件,即根据当前登录的用户生成菜单链接?

我认为是这样的:

if request.user.owned_pages.exists():
   for p in request.user.owned_pages.all():
      if p.get_parent.id == 17:
         edit_link = "/dashboard/pages/" + p.id + "/edit/"

但是我怎样才能在 Wagtail 菜单挂钩中实现这样的东西呢?

【问题讨论】:

    标签: django view wagtail


    【解决方案1】:

    default implementation of MenuItem 假定 URL 在所有页面请求中都是不变的,这意味着我们可以将该固定 URL 传递给 register_admin_menu_item 挂钩(在服务器启动时运行)内的 MenuItem 构造函数。

    在您的情况下,这不是真的,因此您需要定义MenuItem 的自定义子类。如果查看MenuItem 的代码,您会发现它实现了get_context(self, request) 方法来收集渲染菜单项所需的所有模板变量,包括url。您可以覆盖此方法以设置动态 URL 来代替固定 URL:

    class EditProfileMenuItem(MenuItem):
        def get_context(self, request):
            context = super().get_context(request)
    
            edit_link = None
            if request.user.owned_pages.exists():
               for p in request.user.owned_pages.all():
                  if p.get_parent().id == 17:
                     edit_link = "/dashboard/pages/" + p.id + "/edit/"
    
            if edit_link:
                context['url'] = edit_link
    
            return context
    

    然后,您可以在 register_admin_menu_item 挂钩中使用此子类,代替 MenuItem

    @hooks.register('register_admin_menu_item')
    def register_edit_menu_item():
        return EditProfileMenuItem('Edit profile', 'edit_link', classnames='icon icon-folder-inverse', order=10000)
    

    (根据您的要求,您可能还需要覆盖 is_shown 方法,以便对那些没有配置文件的用户隐藏菜单项。)

    【讨论】:

    • 太棒了!谢谢,就像一个魅力。唯一要补充的是,我在伪代码中忘记了 p.id 返回一个整数,所以它应该是 str(p.id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多