从wagtailstreamforms删除内置字段

时间:2018-10-12 09:25:38

标签: django wagtail

我正试图从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]))

有没有办法做到这一点,无论是骇客还是其他?我正在使用Wagtailstreamforms 3.1和Wagtail版本2.2.2。

3 个答案:

答案 0 :(得分:2)

我是wagtailstreamforms的作者,并遇到了这个问题。限制从程序包加载哪些默认表单字段的功能是个好主意。

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

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

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

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

请留下有关公关或公开问题的任何意见/建议。如果您对此满意,则可以更新文档,合并,发布,然后可以将其修改为答案。

干杯,斯图。

答案 1 :(得分:0)

一种方法是覆盖此模板: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 %}

答案 2 :(得分:0)

通过将以下代码放入应用程序的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。