Django 如何使用Wagtail钩子在Wagtail中生成自定义链接
所以我想在Wagtail管理中添加一个额外的链接。我正在遵循docs()并使用这个钩子构建一个新的菜单项 他们使用此挂钩添加菜单项: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) 这应该成为一个链接,开始编辑当前登录用户拥有的页面。在模板中
@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)