您如何在 wagtail modeladmin 中注销模型?
How do you unregister a model in wagtail modeladmin?
我需要做等同于... 'admin.site.unregister(Value)' 但对于在 wagtail_hooks.py 中使用 'modeladmin_register(Value)' 向 wagtailmodeladmin 注册的模型。你是怎么做到的?
我知道这是一个老问题,但简短的回答是 "There is no unregister equivalent"。
在标准的 Django 中,您在 Django 的管理区域中看到的所有模型都以类似的方式注册,因此在那里取消注册是有意义的。在 Wagtail 中,管理区域是完全自定义的,并且 'modeladmin' 不像 Django 的类似解决方案那样是管理架构的中心。 Wagtail 中的各种应用程序不使用 import/use 它来注册自己的模型。因此,无法 'unregister' 使用 modeladmin 的任何这些应用程序。 'modeladmin' 应用程序只是一个实用程序,可帮助您为其他模型添加接口,而无需了解 wagtail 提供的所有各种挂钩来执行此类操作。
因此,'modeladmin' 仅用于注册自定义模型,大大减少了对 'unregister' 方法的需求,因为在大多数情况下,您可以控制要注册的模型正在通过 modeladmin_register 方法注册,因此您应该可以只 'not register' 那些。
没有内置方法,但如果您想添加自己的方法:
# helpers.py
from wagtail import hooks
def replace_hook(hook_name, original_fn):
hooks._hooks[hook_name].remove((original_fn, 0))
def inner(fn):
hooks.register('register_page_listing_buttons', fn)
return fn
return inner
假设我们想从列表视图中删除除 "add child page":
之外的所有按钮
# wagtail_hooks.py
import helpers
@replace_hook('register_page_listing_buttons', page_listing_buttons)
def remove_redundant_buttons(page, page_perms, is_parent=False):
buttons = page_listing_buttons(page, page_perms, is_parent)
if isinstance(page, models.BasePage):
return buttons
else:
# for non-subclasses-of-BasePage allow only adding children
allowed_urls = ['add_subpage']
return [
item for item in buttons
if item.url and resolve(item.url).url_name in allowed_urls
]
结果:
我还没有在 wagtail 中发现这样的功能,但对于我来说,从主菜单中排除一个模型就足够了,所以我做了下一步:
@hooks.register('construct_main_menu')
def hide_longlaw_order(request, menu_items):
menu_items[:] = [item for item in menu_items if 'longclaworders' not in item.url]
我需要做等同于... 'admin.site.unregister(Value)' 但对于在 wagtail_hooks.py 中使用 'modeladmin_register(Value)' 向 wagtailmodeladmin 注册的模型。你是怎么做到的?
我知道这是一个老问题,但简短的回答是 "There is no unregister equivalent"。
在标准的 Django 中,您在 Django 的管理区域中看到的所有模型都以类似的方式注册,因此在那里取消注册是有意义的。在 Wagtail 中,管理区域是完全自定义的,并且 'modeladmin' 不像 Django 的类似解决方案那样是管理架构的中心。 Wagtail 中的各种应用程序不使用 import/use 它来注册自己的模型。因此,无法 'unregister' 使用 modeladmin 的任何这些应用程序。 'modeladmin' 应用程序只是一个实用程序,可帮助您为其他模型添加接口,而无需了解 wagtail 提供的所有各种挂钩来执行此类操作。
因此,'modeladmin' 仅用于注册自定义模型,大大减少了对 'unregister' 方法的需求,因为在大多数情况下,您可以控制要注册的模型正在通过 modeladmin_register 方法注册,因此您应该可以只 'not register' 那些。
没有内置方法,但如果您想添加自己的方法:
# helpers.py
from wagtail import hooks
def replace_hook(hook_name, original_fn):
hooks._hooks[hook_name].remove((original_fn, 0))
def inner(fn):
hooks.register('register_page_listing_buttons', fn)
return fn
return inner
假设我们想从列表视图中删除除 "add child page":
之外的所有按钮# wagtail_hooks.py
import helpers
@replace_hook('register_page_listing_buttons', page_listing_buttons)
def remove_redundant_buttons(page, page_perms, is_parent=False):
buttons = page_listing_buttons(page, page_perms, is_parent)
if isinstance(page, models.BasePage):
return buttons
else:
# for non-subclasses-of-BasePage allow only adding children
allowed_urls = ['add_subpage']
return [
item for item in buttons
if item.url and resolve(item.url).url_name in allowed_urls
]
结果:
我还没有在 wagtail 中发现这样的功能,但对于我来说,从主菜单中排除一个模型就足够了,所以我做了下一步:
@hooks.register('construct_main_menu')
def hide_longlaw_order(request, menu_items):
menu_items[:] = [item for item in menu_items if 'longclaworders' not in item.url]