Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何使用Wagtail钩子在Wagtail中生成自定义链接_Django_View_Wagtail - Fatal编程技术网

Django 如何使用Wagtail钩子在Wagtail中生成自定义链接

Django 如何使用Wagtail钩子在Wagtail中生成自定义链接,django,view,wagtail,Django,View,Wagtail,所以我想在Wagtail管理中添加一个额外的链接。我正在遵循docs()并使用这个钩子构建一个新的菜单项 他们使用此挂钩添加菜单项: @hooks.register('register\u admin\u menu\u item') def寄存器\编辑\菜单\项(): 返回菜单项('Edit profile','Edit_link',classnames='icon-icon-folder-inverse',order=10000) 这应该成为一个链接,开始编辑当前登录用户拥有的页面。在模板中

所以我想在Wagtail管理中添加一个额外的链接。我正在遵循docs()并使用这个钩子构建一个新的菜单项

他们使用此挂钩添加菜单项:

@hooks.register('register\u admin\u menu\u item')
def寄存器\编辑\菜单\项():
返回菜单项('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 %}
但是我如何在Wagtail菜单钩子中实现类似的东西呢?

假设URL在所有页面请求中都是恒定的,这意味着我们可以将固定的URL传递给
注册表管理菜单项
钩子(在服务器启动时运行)中的
菜单项
构造函数

在您的例子中,这不是真的,因此您需要定义
MenuItem
的自定义子类。如果查看
MenuItem
的代码,您将看到它实现了
get\u 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\u admin\u菜单项
hook中使用此子类来代替
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)
(根据您的要求,您可能希望覆盖显示的
方法,以便对没有配置文件的用户隐藏菜单项。)

假定URL在所有页面请求中都是恒定的,这意味着我们可以将该固定URL传递给
register\u admin\u菜单项
hook(在服务器启动时运行)中的
MenuItem
构造函数

在您的例子中,这不是真的,因此您需要定义
MenuItem
的自定义子类。如果查看
MenuItem
的代码,您将看到它实现了
get\u 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\u admin\u菜单项
hook中使用此子类来代替
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)

(根据您的要求,您可能希望覆盖显示的
方法,以便对没有配置文件的用户隐藏菜单项。)

太棒了!谢谢,很有魅力。唯一需要补充的是,我在伪代码中忘记了
p.id
返回一个整数,所以它应该是
str(p.id)
Awesome!谢谢,很有魅力。唯一需要补充的是,我在伪代码中忘记了
p.id
返回一个整数,因此它应该是
str(p.id)