我可以限制Wagtail管理员图像选择器中的可见集合吗?

时间:2017-09-25 04:04:13

标签: django wagtail

我有一些群组和收藏集设置,以便利用收藏夹功能。

我只限集合管理员

以非管理员身份登录并点击“选择图像”后,按钮调出图像选择器,收集'收集'它包括我的所有馆藏,包括受限制的集合

是否可以仅显示用户拥有的集合和图像,类似于'图像'菜单项有效吗?

W :: 1.12.2 Django:1.8.18

1 个答案:

答案 0 :(得分:1)

我知道问这个问题已经有一段时间了,但是希望这个答案对某些人有帮助。

解决方案概述

Wagtail 1.10(在本文中,2.10正在开发中)引入了一个有用的钩子,称为construct_image_chooser_queryset。该挂钩将截取图像,然后将其返回给图像选择器模式(在Wagtail管理员中使用),并使开发人员可以自定义返回的图像。

该钩子也可以访问该请求,从那里您可以计算出用户并相应地建立图像查询。

问题的另一部分涉及collections下拉字段,这需要一些Django模板工作,但是可以实现,而没有太多额外的复杂性。任何具有自定义模板的Wagtail admin template can be overridden,只需使用现有模板路径对其进行命名即可。

发布时用于渲染集合下拉列表的Django共享模板(包括)为wagtail/admin/templates/wagtailadmin/shared/collection_chooser.html

示例代码

注意:由于问题没有更改收集模型,因此代码不是完整的解决方案,但希望它将是一个很好的开始。

1。 g图像选择器查询集挂钩

from wagtail.core import hooks


@hooks.register('construct_image_chooser_queryset')
def show_my_uploaded_images_only(images, request):
    # Example: Only show uploaded images based on current user
    # actual filtering will need to be based on the collection's linked user group
    images = images.filter(uploaded_by_user=request.user)

    return images

2。集合选择器模板覆盖

  • 2a文件:../ templates / wagtailadmin / shared / collection_chooser.html
  • 我们要覆盖模板并将其重定向到自定义图片,前提是模板的上下文中存在图片
{% extends images|yesno:"base/include/images_collection_chooser.html,wagtailadmin/shared/collection_chooser.html" %}
  • 2b文件:../ templates / base / include / images_collection_chooser.html
  • 仅当上下文中有图像时才使用此模板
  • 在此我们修改上下文以删除图像并过滤器集合,然后呈现原始的Wagtail管理模板
{% load filter_with_permissions %}

{% with images=None %}
    {% with collections=collections|filter_with_permissions:user %}
      Images Only Collection Template:
      {% include "wagtailadmin/shared/collection_chooser.html" %}
    {% endwith %}
{% endwith %}
  • 2c文件:bakerydemo / base / templatetags / filter_with_permissions.py
  • 在这里,我们制作进行集合过滤的Django template tag
from django import template

register = template.Library()


@register.filter(name='filter_with_permissions')
def filter_with_permissions(collections, user):
    """ filter the collections based on current user """
    return collections.filter(name__startswith='B')  # actual filter to be done