from wagtail.documents.blocks import DocumentChooserBlock
class SpecificDocumentChooserBlock(DocumentChooserBlock):
"""
Existing DocumentChooserBlock with the ability to add widget attrs based on the
accept kwarg, anything on self.widget.attrs will be added to the hidden
input field (so be careful what key is used).
"""
def __init__(self, accept=None, **kwargs):
super().__init__(**kwargs)
self.widget.attrs["accept"] = accept
from wagtail.core.telepath import register as telepath_register
from wagtail.documents.widgets import AdminDocumentChooser, DocumentChooserAdapter
class CustomDocumentChooserAdapter(DocumentChooserAdapter):
def js_args(self, widget):
return [
widget.render_html(
# this line is changed, allocate any widget.attrs to the attrs passed to render_html
"__NAME__",
None,
attrs={**widget.attrs, "id": "__ID__"},
),
widget.id_for_label("__ID__"),
]
telepath_register(CustomDocumentChooserAdapter(), AdminDocumentChooser)
{% extends "wagtaildocs/widgets/document_chooser.html" %}
{% comment %}
This template overrides the Wagtail default chooser field, this is not the modal but
the button / selected value shown in the page editor.
chooser_attributes are the attributes that are used by the modal trigger, we will
override the 'data-chooser-url' value with a url param
{% endcomment %}
{% block chooser_attributes %}data-chooser-url="{% url "wagtaildocs:chooser" %}{% if attrs.accept %}?accept={{ attrs.accept }}{% endif %}"{% endblock %}
Wagtail的选择器模式系统的工作原理与普通Django小部件(用于呈现字段html内容的类)略有不同,小部件本身主要呈现一个按钮“选择文档”,然后按钮触发一个模式,该模式是一个单独的视图和模板
正如您所指出的,^{} hook 可以限制这些模式中显示的结果,但只能访问正在查看的页面的请求对象,而不能访问用于触发该模式的小部件
有一种方法可以获得一些有限的所需功能,但它不适用于搜索结果,也不会将任何附加上载限制为该文件类型
步骤1-创建自定义
DocumentChooserBlock
DocumentChooserBlock
,并有一个自定义的__init__
方法,该方法提取kwargaccept
并将其分配给小部件属性李>doc_block = SpecificDocumentChooserBlock(accept="svg,md") # uses accept kwarg
的kwarg<input type="hidden" name="body-2-value" accept="svg,md" id="body-2-value" value="">
的隐藏属性块.py- 不幸的是,用于查询URL的数据不在上面的HTML输入元素上,而是在容器div上,请参见
- 此数据属性由名为Telepath的系统生成李>
- 需要理解的主要部分是,有一个类用于告诉浏览器基于小部件渲染什么,默认情况下,它不会传递小部件属性李>
- 下面的代码应该添加到
- 行
步骤2-确保小部件属性被传递到模式触发器
document-chooser
块div上的data-chooser-url
wagtail_hooks.py
,因为我们无论如何都需要该文件,而且我们知道它在运行时只运行一次李>widget.render_html(
是关键部分,我们正在使用**
语法来解压任何widget.attrs值(其中一个是自定义块设置的accept
项)李>hooks.py- 请查看Customising admin templates的文档,因为您可能需要为
- 创建一个新文件
- 在模板中,我们将扩展原始块并覆盖块
- 重要提示:在这里重新启动dev服务器,因为您已经添加了一个新的模板覆盖李>
- 完成后,在浏览器中检查包含“选择文档”按钮的元素,您应该能够看到容器元素现在有一个
步骤3-覆盖文档选择器的管理模板
INSTALLED_APPS
添加更多的应用程序来完成此步骤李>myapp/templates/wagtaildocs/widgets/document_chooser.html
,templates
之后的部分在这里非常重要,因为我们想要覆盖和扩展这个精确的模板李>chooser_attributes
,因为这是添加选择器模式触发器使用的data-chooser-url
的部分李>data-chooser-url
,URL中添加了一个查询字符串<div id="body-2-value-chooser" class="chooser document-chooser blank" data-chooser-url="/admin/documents/chooser/?accept=svg,md">
myapp/templates/wagtaildocs/widgets/document\u chooser.html- 现在使用
步骤4-处理
accept
查询字符串参数construct_document_chooser_queryset
,可以拉入GET参数accept
并对其进行解析以生成一组不同的文档结果李>摇尾钩.py- 此解决方案不会阻止用户仅上传模式中的特定文件,但您可以探索使用一些CSS隐藏该选项卡(块接受类名属性)李>
- 当用户在模式中搜索时,不幸的是,它不会遵守以这种方式设置的URL李>
- 解决方案在各种版本中都可能很脆弱,尤其是
警告
CustomDocumentChooserAdapter
,所以一定要注意摇摆代码的变化李>使用^{} 提供了更多定制选择器模式工作方式的能力
步骤1-安装
wagtail-generic-chooser
pip install wagtail-generic-chooser
generic_chooser
添加到项目的INSTALLED_APPS
李>步骤2-设置选择器视图集
ModelChooserMixin
的自定义类来处理accept
参数,这意味着在搜索时仍会传递参数李>accept
URL参数的处理,以有条件地筛选返回值李>ModelChooserViewSet
的类,该类将处理模式中Document
列表的显示李>基本/视图.py- 此小部件不是
- 与Setting up of a model based Widget类似,创建一个扩展
- 在
- 重写
- 覆盖“get\u choose\u modal\u url
步骤3-创建选择器小部件
Block
,但将用作Block
的基础,也可用于FieldPanel
李>AdminChooser
的类李>__init__
方法中,我们拉出accept
kwarg,以便使用它生成自定义URL参数李>get_edit_item_url
方法,该方法允许单击所选的文档进行编辑李>to append the URL query param (note: I could not get
reverse`working here而不产生更多的争论)李>base/models.py- 这里不需要使用
步骤4-在Wagtail钩子中注册选择器视图集
construct_document_chooser_queryset
,而是使用钩子register_admin_viewset
并注册RestrictedDocumentChooserViewSet
李>底座/摇尾钩.py- 此类扩展了
- 在
- 这个块可以通过调用类似于任何其他块的方法来使用,但使用kwarg
步骤5-设置并使用自定义
Block
ChooserBlock
并包装了已创建的RestrictedDocumentChooser
小部件李>__init__
上,相同的kwargaccept
被拉出,并在创建时传递给RestrictedDocumentChooser
李>accept
doc_block = RestrictedDocumentChooserBlock(accept="svg,md")
基本/块.py
相关问题 更多 >
编程相关推荐