从 wagtailstreamforms 中删除内置字段

Removing built-in fields from wagtailstreamforms

我正在尝试从 wagtailstreamforms 管理页面中删除日期、时间和多选字段,这样它们就不能在站点范围内以任何形式使用。

我试过调用 register('<field_name>', None) 来摆脱它,但这不起作用:

# wagtailstreamforms_fields.py
from wagtailstreamforms.fields import register

@register('date', None)
@register('time', None)
@register('multiselect', None)

并创建一个 AppConfig 来手动清除条目的 wagtailstreamforms.fields._fields 字典,但这似乎也不起作用。我已确保此 AppConfig 是在 wagtailstreamforms 之后加载的应用程序的一部分。

class UpdatedConfig(AppConfig):
    name = 'my_new_app'

    def ready(self):
        from wagtailstreamforms.fields import _fields

        _fields.pop('date')
        _fields.pop('datetime')
        _fields.pop('multiselect')

        for x in _fields.keys():
            print('{}: {}'.format(x, _fields[x]))

有什么方法可以做到这一点吗,hacky 或其他?我正在使用 Wagtailstreamforms 3.1 和 Wagtail 版本 2.2.2。

一种方法是覆盖此模板:https://github.com/wagtail/wagtail/blob/master/wagtail/admin/templates/wagtailadmin/block_forms/stream_menu.html

{% for child_block in child_blocks.list %}
    {% if child_block.name != "date" and child_block.name != "datetime" and child_block.name != "multiselect" %}
        <li><button type="button" class="button action-add-block-{{ child_block.name }} icon icon-{{ child_block.meta.icon }}"><span>{{ child_block.label }}</span></button></li>
    {% endif %}
{% endfor %}

我是 wagtailstreamforms 的作者并且遇到了这个。限制从包中加载哪些默认表单字段的能力是个好主意。

我建议不要从寄存器方法加载它们,而是从设置字典加载它们,即:

WAGTAILSTREAMFORMS_DEFAULT_FIELDS = {
    'singleline': 'wagtailstreamforms.fields.SingleLineTextField',
    'multiline': 'wagtailstreamforms.fields.MultiLineTextField',
    'dropdown': 'wagtailstreamforms.fields.DropdownField'
}

默认为所有内部字段。这样它就可以很容易地被覆盖。我们将保留 register 装饰器,以免破坏任何东西。

https://github.com/AccentDesign/wagtailstreamforms/pull/110

请在 pr 或 open issue 上留下任何意见/建议。如果您对此感到满意,将更新文档、合并、发布然后可以将其修改为答案。

干杯,斯图

我们可以通过将以下代码放入应用程序的 wagtailstreamforms_fields.py

来获得所需的内容
# wagtailstreamforms_fields.py
from wagtailstreamforms.fields import _fields

if _fields.get('date'):
    del(_fields['date'])
if _fields.get('datetime'):
    del(_fields['datetime'])
if _fields.get('multiselect'):
    del(_fields['multiselect'])

所以我猜你可以说它是上述两种方法的混合体。它可能在不久的将来会过时,请参阅 Stuart George 的回答及其链接的 PR。