我在名为 profile_images 的模型中有一个字段,如何将图像选择器面板中显示的图像限制为配置文件图像集合?
我也想对画廊收藏的内联面板做同样的事情。
这意味着我不能使用权限,因为用户应该可以访问这两个集合。
谢谢您的帮助
我在名为 profile_images 的模型中有一个字段,如何将图像选择器面板中显示的图像限制为配置文件图像集合?
我也想对画廊收藏的内联面板做同样的事情。
这意味着我不能使用权限,因为用户应该可以访问这两个集合。
谢谢您的帮助
Wagtail 有一个名为的功能hooks
,可以让您修改 Wagtail 的一些内部逻辑,这是一个非常有用的功能,可以让您做到这一点。
有一个钩子叫做construct_image_chooser_queryset
. 您将需要wagtail_hooks.py
在您的应用程序文件夹之一中创建一个文件,该文件由 Wagtail 在应用程序运行时运行。
一旦你运行了钩子,你可以images
为图像选择器模式注入自定义过滤结果。这个钩子将针对整个 Wagtail 中的各种图像列表运行,因此您将需要添加一些逻辑以确保您不会在任何地方过滤图像。
一种可能的方法是读取传递给钩子的请求,以确定当前请求是否用于页面编辑场景。一旦你知道了这一点,你就可以计算出正在使用的页面类,然后根据页面类上的一些类方法过滤你的图像。
当对图像选择器模式发出请求时,您可以读取HTTP_REFERRER并从该 URL 使用 Djangoresolve
来确定它被调用的位置以及正在编辑的页面。
HTTP_REFERRER
urlparse
andresolve
返回一个 Djangomatch
对象Page
并使用该specific_class
属性wagtail_hooks.py
from django.urls import resolve
from urllib.parse import urlparse
from wagtail.core import hooks
from wagtail.core.models import Page
@hooks.register('construct_image_chooser_queryset')
def show_images_for_specific_collections_on_page_editing(images, request):
# first - pull out the referrer for this current AJAX call
http_referrer = request.META.get('HTTP_REFERER', None) or '/'
# second - use django utils to find the matched view
match = resolve(urlparse(http_referrer)[2])
# if we are editing a page we can restrict the available images
if (match.app_name is 'wagtailadmin_pages') and (match.url_name is 'edit'):
page = Page.objects.get(pk=match.args[0])
# important: wrap in a try/except as this may not be implemented on all pages
image_collection_id = page.specific_class.get_image_collection()
# return filtered images
return images.filter(collection=image_collection_id)
return images
models.py
from wagtail.core.models import Page
class BlogPage(Page):
# ...
@classmethod
def get_image_collection(cls):
# any logic here to determine what collection to filter by
return 4