Как ограничить панель выбора изображений трясогузки коллекцией

У меня есть поле в модели под названием profile_images, как мне ограничить изображения, показанные на панели выбора изображений, коллекцией изображений профиля?

Я также хочу сделать то же самое со встроенной панелью для коллекции галереи.

Это означает, что я не могу использовать разрешения, так как пользователь должен иметь доступ к обеим коллекциям.

Спасибо за помощь

1 ответ

Решение

У трясогузки есть особенность под названием hooks который позволяет вам изменять некоторую внутреннюю логику Wagtail, это очень полезная функция, которая может позволить вам это сделать.

Есть крючок под названием construct_image_chooser_queryset. Вам нужно будет создать файлwagtail_hooks.py в одной из папок вашего приложения это запускается Wagtail при запуске приложения.

Когда у вас запущен хук, вы можете ввести пользовательскую фильтрацию imagesрезультаты для модального окна выбора изображения. Этот хук будет работать для различных списков изображений по всему Wagtail, поэтому вам нужно добавить некоторую логику, чтобы гарантировать, что вы не фильтруете изображения повсюду.

Потенциальным подходом было бы прочитать запрос, который передается в ловушку, чтобы определить, относится ли текущий запрос к сценарию редактирования страницы. Как только вы это узнаете, вы можете определить, какой класс страницы используется, а затем отфильтровать изображения на основе какого-либо метода класса в классе страницы.

Когда делается запрос для модального окна выбора изображения, вы можете прочитать HTTP_REFERRER и из этого URL использовать Django's resolve чтобы определить, где он был вызван и какая страница редактируется.

пример

  • Используя описанный выше крючок, мы читаем HTTP_REFERRER
  • Использовать urlparse а также resolve вернуть Django match объект
  • Прочтите данные матча, чтобы убедиться, что мы редактируем страницу
  • При редактировании страницы мы запрашиваем это Page и использовать specific_class свойство
  • Наконец, мы можем получить идентификатор коллекции из класса для фильтрации изображений.
  • Примечание: как получить идентификатор коллекции на 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

Другие вопросы по тегам