1

我在名为 profile_images 的模型中有一个字段,如何将图像选择器面板中显示的图像限制为配置文件图像集合?

我也想对画廊收藏的内联面板做同样的事情。

这意味着我不能使用权限,因为用户应该可以访问这两个集合。

谢谢您的帮助

4

1 回答 1

2

Wagtail 有一个名为的功能hooks,可以让您修改 Wagtail 的一些内部逻辑,这是一个非常有用的功能,可以让您做到这一点。

有一个钩子叫做construct_image_chooser_queryset. 您将需要wagtail_hooks.py在您的应用程序文件夹之一中创建一个文件,该文件由 Wagtail 在应用程序运行时运行。

一旦你运行了钩子,你可以images为图像选择器模式注入自定义过滤结果。这个钩子将针对整个 Wagtail 中的各种图像列表运行,因此您将需要添加一些逻辑以确保您不会在任何地方过滤图像。

一种可能的方法是读取传递给钩子的请求,以确定当前请求是否用于页面编辑场景。一旦你知道了这一点,你就可以计算出正在使用的页面类,然后根据页面类上的一些类方法过滤你的图像。

当对图像选择器模式发出请求时,您可以读取HTTP_REFERRER并从该 URL 使用 Djangoresolve来确定它被调用的位置以及正在编辑的页面。

例子

  • 使用上面描述的钩子,我们阅读了HTTP_REFERRER
  • 使用urlparseandresolve返回一个 Djangomatch对象
  • 阅读匹配数据以确认我们正在编辑页面
  • 如果编辑页面,我们会查询Page并使用该specific_class属性
  • 最后,我们可以从类中获取一个集合 id 来过滤图像
  • 注意:如何获取集合 id 100% 取决于您,您可以对其进行硬编码,将其设为单独的函数,甚至将其设为特定的类方法,只要注意确保如果该方法不可用,它就能全部工作可在所有页面上使用。
  • 在其他图像选择器中进行测试,以确保没有其他问题。
  • 这不会“隐藏”图像选择器模式上的集合下拉列表,不幸的是,您可能只需要使用 CSS 或 JS 来执行此操作。
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

于 2020-06-28T10:53:17.227 回答