限制 Wagtail Steamfield 中特定 DocumentChooserBlock() 块的文件类型

2023-12-08

我试图限制 wagtail 流字段块内特定 DocumentChooserBlock 的查询结果。

我已经知道您可以使用以下方法限制页面类型的文档选择器的文件类型hooks,但我想避免限制页面范围内可能的文件类型,以防我需要它们用于其他 StreamField 块。

有没有可能的方法来实现我在这里想要实现的目标?


Using wagtail-generic-chooser提供了更多定制选择器模式工作方式的能力。

第 1 步 - 安装wagtail-generic-chooser

  • Run: pip install wagtail-generic-chooser
  • 然后加generic_chooser到你的项目的INSTALLED_APPS.

第 2 步 - 设置选择器视图集

  • 类似于文档说明设置选择器视图集
  • 确保我们能够处理accept参数通过创建扩展的自定义类ModelChooserMixin,这意味着搜索时参数仍然会被传递。
  • 添加处理accept有条件地过滤返回值的 URL 参数。
  • 设置一个扩展类ModelChooserViewSet这将处理的显示Document在模式中列出。

基础/views.py

from django.db.models import Q

from generic_chooser.views import ModelChooserMixin, ModelChooserViewSet

from wagtail.documents.models import Document


class RestrictedDocumentChooserMixin(ModelChooserMixin):
    # preserve this URL parameter on pagination / search
    preserve_url_parameters = [
        "accept",
    ]

    def get_unfiltered_object_list(self):
        objects = super().get_unfiltered_object_list()

        accept = self.request.GET.get("accept")
        print("get_unfiltered_object_list", accept)

        if accept:
            accepted_files = accept.split(",")

            queries = [Q(file__iendswith=f".{value}") for value in accepted_files]

            query = queries.pop()
            for item in queries:
                query |= item

            objects = objects.filter(query)
        return objects


class RestrictedDocumentChooserViewSet(ModelChooserViewSet):
    chooser_mixin_class = RestrictedDocumentChooserMixin

    icon = "doc"
    model = Document
    page_title = "Choose a document"
    per_page = 10
    order_by = "title"
    fields = ["title", "file"]

第 3 步 - 创建选择器小部件

  • 这个小部件不是Block但将用作基础Block也可用于FieldPanel.
  • 类似于设置基于模型的 Widget创建一个类来扩展AdminChooser.
  • In the __init__方法我们拉出acceptkwarg,因此我们可以使用它来生成自定义 URL 参数。
  • 覆盖get_edit_item_url方法将允许点击selected编辑它的文档。
  • 覆盖``get_choose_modal_urlto append the URL query param (note: I could not get在这里工作,没有更多的争论)。

基础/模型.py

from django.contrib.admin.utils import quote
from django.urls import reverse

from generic_chooser.widgets import AdminChooser

from wagtail.documents.models import Document


class RestrictedDocumentChooser(AdminChooser):
    def __init__(self, **kwargs):

        self.accept = kwargs.pop("accept")

        super().__init__(**kwargs)

    choose_one_text = "Choose a Document"
    choose_another_text = "Choose another document"
    link_to_chosen_text = "Edit this document"
    model = Document
    choose_modal_url_name = "restricted_document_chooser:choose"

    def get_choose_modal_url(self):
        url = super().get_choose_modal_url()
        return url + "?accept=%s" % self.accept

    def get_edit_item_url(self, item):
        return reverse("wagtaildocs:edit", args=[item.id])

第 4 步 - 在 Wagtail Hooks 中注册选择器视图集

  • 无需使用construct_document_chooser_queryset在这里,改为使用钩子register_admin_viewset并注册RestrictedDocumentChooserViewSet.

基地/wagtail_hooks.py

from wagtail.core import hooks
from .views import RestrictedDocumentChooserViewSet

# ... other hooks etc

@hooks.register("register_admin_viewset")
def register_restricted_document_chooser_viewset():
    return RestrictedDocumentChooserViewSet(
        "restricted_document_chooser", url_prefix="restricted-document-chooser"
    )

第 5 步 - 设置并使用自定义Block

  • 这个类扩展了ChooserBlock并包裹RestrictedDocumentChooser已创建的小部件。
  • On __init__同一个夸格accept被拉出并传递给RestrictedDocumentChooser创建时。
  • 该块可以通过与任何其他块类似的方式调用它来使用,使用 kwargaccept尽管。doc_block = RestrictedDocumentChooserBlock(accept="svg,md")

基础/块.py

from django.utils.functional import cached_property
from wagtail.images.blocks import ChooserBlock

# ...

class RestrictedDocumentChooserBlock(ChooserBlock):
    def __init__(self, **kwargs):
        self.accept = kwargs.pop("accept")
        super().__init__(**kwargs)

    @cached_property
    def target_model(self):
        from wagtail.documents.models import Document

        return Document

    @cached_property
    def widget(self):
        from .widgets import RestrictedDocumentChooser

        return RestrictedDocumentChooser(accept=self.accept)

    def get_form_state(self, value):
        return self.widget.get_value_data(value)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制 Wagtail Steamfield 中特定 DocumentChooserBlock() 块的文件类型 的相关文章

  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • 如何检索分配给 Django 中的组的所有权限

    我正在执行一项任务来检索分配给 Django 中的组的一组权限 我可以使用以下代码获取创建的组 但无法使用它来获取分配给它们的权限 from django contrib auth models import Group Permissio
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 如何在动态执行的代码字符串中使用inspect.getsource?

    如果我在文件中有这段代码 import inspect def sample p1 print p1 return 1 print inspect getsource sample 当我运行脚本时 它按预期工作 在最后一行 源代码sampl
  • 将多索引转换为行式多维 NumPy 数组。

    假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http pandas pydata org pandas docs stable advanced html gt gt gt df 0 1 2 3 fir
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • Pandas如何按时间段过滤DataFrame

    我有一个包含下表的文件 Name AvailableDate totalRemaining 0 X3321 2018 03 14 13 00 00 200 1 X3321 2018 03 14 14 00 00 200 2 X3321 20
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 如何处理 Tkinter 中的窗口关闭事件?

    如何在 Python Tkinter 程序中处理窗口关闭事件 用户单击 X 按钮 Tkinter 支持一种称为协议处理程序 http web archive org web 20201111215134 http effbot org tk
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • Bootstrap 下拉菜单隐藏在模式中

    您好 我正在尝试获取引导下拉列表以显示模型内的列表 我想我要说的是 当我单击下拉菜单时 它会展开 但如果列表比模型长 它将切断列表的其余部分 导致用户无法选择所有选项 我一直在谷歌搜索并看到这篇文章点击这里这与我的问题非常相似 然而 他们说
  • Pandas 使用正则表达式分隔符读取 csv

    我一直在尝试读取这样的自定义 csv 文件 6 Rotterdam NLD Zuid Holland 593321 19 Zaanstad NLD Noord Holland 135621 214 Porto Alegre BRA Rio
  • java 类型推断是如何工作的?

    有人可以解释一下以下语法是如何工作的吗 public static
  • 有关 PHP 中网络爬虫的错误

    我正在尝试使用 PHP 创建一个简单的网络爬虫 它能够爬行 edu 域 并提供父级的种子 url 我使用了简单的html dom来实现爬虫 而一些核心逻辑是我自己实现的 我将发布下面的代码并尝试解释这些问题 private function
  • ios 在“确认您的应用内购买”对话框中显示不同的价格

    为 iOS 应用添加应用内购买 我可以成功购买该产品 但 确认您的应用内购买 对话框始终显示与我格式化的本地化价格相比的额外价格 示例 产品的本地化价格为 39 99 欧元 但在确认对话框中 产品的价格增加到 41 73 欧元 预先感谢您提
  • Maven的pom.xml中的pluginManagement是什么?

    这是我的 pom 文件的一个片段
  • 分区:如何在每个分区后添加等待

    我有一个每分钟接受 20 个请求的 API 之后我需要等待 1 分钟才能查询它 我有一个项目列表 通常超过 1000 个 我需要从 API 查询其详细信息 我的想法是我可以使用Partitioner将我的列表分为 20 个项目 请求 但很快
  • jquery foreach div 随机颜色

    我的函数有这个问题 我试图将一些颜色 预定义 随机化到我的 div 中 并在每次使用颜色时进行计数 这是我的html div class change color2 div div class change color2 div div c
  • mysql中为什么null<>null=null

    我正在学习 MySql 教程 并且完成了以下查询 mysql gt select null lt gt null null lt gt null NULL 我不明白为什么结果是 Null 我认为它需要是 1 或 0 基于其他比较运算符的结果
  • Aws Api Gateway 集成请求 如何将属性附加到请求正文?

    我想在将请求正文和查询字符串参数发送到 lambda 之前将其组合起来 假设我在 Lambda 中有一个实体 如下所示 Class Person private String firstName private String lastNam
  • 在 Pandas 中创建空数据框并指定列类型

    我正在尝试创建一个带有索引的空数据框并指定列类型 我这样做的方式如下 df pd DataFrame index pbp columns contract state and county code state county startin
  • Android:SDK和库项目有什么区别

    对于像facebook这样的应用程序 他们提供了SDK 我使用了许多第三方库来满足不同的需求 这两种情况有什么区别 这是作为库或 sdk 捆绑的代码 A Library是一段代码 您可以从自己的代码中调用它 以帮助您更快 更轻松地完成任务
  • 我可以让Shiny在更新之前等待numericInput更长的时间吗?

    在我的 Shiny 应用程序中 有一些numericInput and selectInput Shiny 在键入期间更新输出 尤其是当用户在 numericInput 中键入速度较慢时 sumbitButton你能习惯停止自动更新吗 但我
  • 实体框架:当数据库更改时如何刷新模型?

    如果您从数据库构建 edmx 文件 然后数据库发生更改 如何让模型接受更改 您是否删除整个模型并重新生成 或者您可以检测到更改吗 我看到一篇文章提到 更新您的模型 rt edmx 文件上的鼠标命令 但我没有看到它 更新您的 edmx 以反映
  • com.google.firebase.FirebaseException:发生内部错误。 [7:]

    我曾经创建帐户并使用 firebase 连接到我的应用程序 但很快当我断开连接时 我无法创建帐户 1 小时后 我设法创建了一个帐户 当我断开连接以查看问题是否解决时 我意识到它仍然存在 通过做task getException 如果帐户创建
  • 使用 VBA Excel 的 SQL 数据透视函数文本文件数据库

    我们在工作中无法访问 SQL Server 因此我必须在 Excel VBA 中设计一个应用程序并使用文本文件 CSV 来存储数据 我查询数据 加入 CSV 没有问题 但我想使用 SQL Pivot Unpivot 语句将其中一列转置为行
  • 处理 RSelenium 错误消息

    目前正在抓取一个页面 该页面可以具有可变数量的元素 并且有时还使用不同的选择器来格式化相同的数据元素 目前正在尝试使用一些 tryCatch 代码忽略 RSelenium 引发的错误 但当指定的元素不在页面上时仍然会停止 result lt
  • bouncycastle 库使用哪个 OpenSSL 版本?

    我正在 Android 中使用 BouncyCastle 库进行 OpenSSL 加密 我的库版本是1 45 我想知道库中使用的是 OpenSSL 版本 任何人都可以帮助我 我怎样才能找到它 BouncyCastle 用 java 实现 它
  • 在悬停时添加底部边框,仅限 CSS

    如何使一条线在悬停时仅出现在链接图像的底部 我可以在悬停时显示内部边框 但我只想显示 border bottom 这是我到目前为止所拥有的 即使它使用轮廓属性而不是边框 links a img links a border none flo
  • 限制 Wagtail Steamfield 中特定 DocumentChooserBlock() 块的文件类型

    我试图限制 wagtail 流字段块内特定 DocumentChooserBlock 的查询结果 我已经知道您可以使用以下方法限制页面类型的文档选择器的文件类型hooks 但我想避免限制页面范围内可能的文件类型 以防我需要它们用于其他 St