为 StreamField 创建 TagsBlock
Creating a TagsBlock for StreamField
我正在尝试创建一个点击块,它有一个标签字段,因此用户可以选择他想要过滤的标签。
我使用 wagtail.admin.widgets import AdminTagWidget
.
创建了标签字段
class TagsBlock(FieldBlock):
field = forms.CharField(
widget=AdminTagWidget
)
class RelatedArticlesBlock(StructBlock):
title = CharBlock(required=False)
filter_tags = TagsBlock()
no_of_items = IntegerBlock()
它按预期方式选择标签。但是当我保存它时会出现验证错误,因为 filter_tags 字段为空。
我应该怎么做才能解决这个问题? (输入未填充所选标签)
稍作改进,在 __init__
调用中设置 field
似乎有效。
基于与 custom block types.
相关的文档
from django import forms
from wagtail.admin.widgets import AdminTagWidget
# ...
class TagsBlock(FieldBlock):
"""
Basic Stream Block that will use the Wagtail tags system.
Stores the tags as simple strings only.
"""
def __init__(self, required=False, help_text=None, **kwargs):
# note - required=False is critical if you are adding this block to an existing streamfield (or you can set up your manual migrations to avoid this need)
self.field = forms.CharField(widget=AdminTagWidget, required=False)
super().__init__(**kwargs)
LB Ben Johnston 帮助我将标签放入块中,但我最终 运行 犯了与您相同的错误,因为我无法将标签字段留空。为了修复它,我修改了上面的内容(LB Ben Jonston 的回答),这样 TagsBlock 现在是:
class TagsBlock(blocks.FieldBlock):
"""
Basic Stream Block that will use the Wagtail tags system.
Stores the tags as simple strings only.
"""
def __init__(self, required=False, help_text=None, **kwargs):
self.field = forms.CharField(widget=AdminTagWidget, required=False)
super().__init__(**kwargs)
required=False
现在位于 self.field 内。
如果用户愿意,这允许我将标签字段留空。
希望对您有所帮助!
LB Ben Johnston 的回答有所帮助,但需要少量补充(至少对我而言)。当我创建新页面但不显示已保存的标签时,它工作得很好。原因是 StreamField 的表单字段是用 js 生成的,并且在呈现 AdminTagWidget 时 field
没有价值。稍后用js添加值。为了避免这种情况,我不得不稍微更新 tag_widget.html
。
之前:
{% include 'django/forms/widgets/text.html' %}
<script>
initTagField(
"{{ widget.attrs.id|escapejs }}",
"{{ widget.autocomplete_url|escapejs }}",
{{ widget.options_json|safe }}
);
</script>
之后:
{% include 'django/forms/widgets/text.html' %}
<script>
document.addEventListener("DOMContentLoaded", function(event) {
initTagField(
"{{ widget.attrs.id|escapejs }}",
"{{ widget.autocomplete_url|escapejs }}",
{{ widget.options_json|safe }}
);
});
</script>
这可以通过在您的应用中覆盖 tag_widget.html
或创建新的小部件来完成:
from wagtail.admin.widgets import AdminTagWidget as BaseAdminTagWidget
class AdminTagWidget(BaseAdminTagWidget):
template_name = "app/widgets/tag_widget.html"
我正在尝试创建一个点击块,它有一个标签字段,因此用户可以选择他想要过滤的标签。
我使用 wagtail.admin.widgets import AdminTagWidget
.
class TagsBlock(FieldBlock):
field = forms.CharField(
widget=AdminTagWidget
)
class RelatedArticlesBlock(StructBlock):
title = CharBlock(required=False)
filter_tags = TagsBlock()
no_of_items = IntegerBlock()
它按预期方式选择标签。但是当我保存它时会出现验证错误,因为 filter_tags 字段为空。
我应该怎么做才能解决这个问题? (输入未填充所选标签)
稍作改进,在 __init__
调用中设置 field
似乎有效。
基于与 custom block types.
相关的文档from django import forms
from wagtail.admin.widgets import AdminTagWidget
# ...
class TagsBlock(FieldBlock):
"""
Basic Stream Block that will use the Wagtail tags system.
Stores the tags as simple strings only.
"""
def __init__(self, required=False, help_text=None, **kwargs):
# note - required=False is critical if you are adding this block to an existing streamfield (or you can set up your manual migrations to avoid this need)
self.field = forms.CharField(widget=AdminTagWidget, required=False)
super().__init__(**kwargs)
LB Ben Johnston 帮助我将标签放入块中,但我最终 运行 犯了与您相同的错误,因为我无法将标签字段留空。为了修复它,我修改了上面的内容(LB Ben Jonston 的回答),这样 TagsBlock 现在是:
class TagsBlock(blocks.FieldBlock):
"""
Basic Stream Block that will use the Wagtail tags system.
Stores the tags as simple strings only.
"""
def __init__(self, required=False, help_text=None, **kwargs):
self.field = forms.CharField(widget=AdminTagWidget, required=False)
super().__init__(**kwargs)
required=False
现在位于 self.field 内。
如果用户愿意,这允许我将标签字段留空。
希望对您有所帮助!
LB Ben Johnston 的回答有所帮助,但需要少量补充(至少对我而言)。当我创建新页面但不显示已保存的标签时,它工作得很好。原因是 StreamField 的表单字段是用 js 生成的,并且在呈现 AdminTagWidget 时 field
没有价值。稍后用js添加值。为了避免这种情况,我不得不稍微更新 tag_widget.html
。
之前:
{% include 'django/forms/widgets/text.html' %}
<script>
initTagField(
"{{ widget.attrs.id|escapejs }}",
"{{ widget.autocomplete_url|escapejs }}",
{{ widget.options_json|safe }}
);
</script>
之后:
{% include 'django/forms/widgets/text.html' %}
<script>
document.addEventListener("DOMContentLoaded", function(event) {
initTagField(
"{{ widget.attrs.id|escapejs }}",
"{{ widget.autocomplete_url|escapejs }}",
{{ widget.options_json|safe }}
);
});
</script>
这可以通过在您的应用中覆盖 tag_widget.html
或创建新的小部件来完成:
from wagtail.admin.widgets import AdminTagWidget as BaseAdminTagWidget
class AdminTagWidget(BaseAdminTagWidget):
template_name = "app/widgets/tag_widget.html"