Django 在结构块中放置标记
我希望能够向我创建的自定义StructBlock添加标记 当前模型如下所示Django 在结构块中放置标记,django,django-models,tags,wagtail,Django,Django Models,Tags,Wagtail,我希望能够向我创建的自定义StructBlock添加标记 当前模型如下所示 class MapsIndicatorBlock(blocks.StructBlock): text_icon = blocks.CharBlock( label='Maps/Indicators Text or Icon', required=False ) pop_up_title = blocks.CharBlock( label='Pop
class MapsIndicatorBlock(blocks.StructBlock):
text_icon = blocks.CharBlock(
label='Maps/Indicators Text or Icon',
required=False
)
pop_up_title = blocks.CharBlock(
label='Pop-Up Title',
required=False
)
pop_up_text = blocks.RichTextBlock(
label ='Pop-Up Text/Image',
required=False
)
pop_up_colour = blocks.CharBlock(
choices=constants.BOOTSTRAP4_BUTTON_COLOUR_CHOICES,
default='btn btn-primary',
max_length=128,
required=False
)
tags = TaggableManager()
objects = models.Manager()
class Meta:
template = 'cityregiontable/map_indicator_block.html'
TaggableManager()设计用于models.model而不是blocks.StructBlock
我试着用下面的方法创建标签,但没有成功。我得到的错误是:无法找到MapsIndicatorBlock的模型。这是正确的,因为MapsIndicatorBlock是块,而不是模型
class MITag(TaggedItemBase):
content_object = models.ForeignKey(
'MapsIndicatorBlock',
on_delete=models.CASCADE,
related_name='tagged_mi_block'
)
如何允许块具有metadat标记?基于文档,作为起点,我们可以生成利用现有Wagtail的自定义字段块
这个小部件为您完成了几乎所有的工作,它将为autocomplete拉入可用的标记,并将保存任何动态创建的新标记
可以读取这些标记,并使用型号@属性
或类似工具更方便地使用它们。记住Streamfields将数据存储为JSON,这样您就不会得到任何开箱即用的模型/数据库链接
局限性
需要注意的是,保存的标记被存储为原始字符串,这意味着如果您有一些更复杂的标记用例,那么您将需要做更多的工作来实现集成。e、 g.标记页面,显示所有使用该标记的页面或Wagtail的ModelAdmin
中的高级标记编辑
在这些情况下,您可以找到一种将页面标记与StreamField标记“同步”的方法,也可以将此工作抽象为mixin。或者,您也可以在标记页面上修改查询,以包括包含所需streamfield数据的查询
示例代码
来自itertools导入链的
来自django导入表单
从wagtail.admin.edit_handlers导入字段面板,StreamFieldPanel
从wagtail.admin.widgets导入AdminTagWidget
从wagtail.core.blocks导入CharBlock、FieldBlock、StructBlock、RichTextBlock
从wagtail.core.fields导入StreamField
从wagtail.core.models导入页面
类标记块(字段块):
"""
将使用Wagtail标记系统的基本流块。
仅将标记存储为简单字符串。
"""
定义初始化(self,required=False,help\u text=None,**kwargs):
#注意:如果要将此标记添加到现有streamfield,则-required=False很重要
self.field=forms.CharField(widget=AdminTagWidget,required=False)
超级()
类映射块(StructBlock):
title=CharBlock(label=“title”,必需=False)
content=RichTextBlock(label=“content”,required=False)
tags=TagsBlock(label=“tags”,required=False)
类元:
图标='站点'
类别位置第页(第页):
"""
特定位置的详细信息。
"""
# ... 其他领域
#这是添加的流字段
map_info=StreamField([('map',MapBlock(required=False))],blank=True)
@财产
def get_标签(自我):
"""
用于拉出保存在结构值内的标记的有用属性
重要提示:对名称和结构进行一些艰难的假设
不获取标记的id,仅获取作为列表的字符串
"""
tags_all=[block.value.get('tags','')。self.test_b中块的拆分('',')]
标签=列表(链。从可编辑(标签全部))
返回标签
#要在管理视图中显示给编辑器的字段
内容面板=[
FieldPanel('title',classname=“full”),
StreamFieldPanel(“地图信息”),
#……其他
]
# ... 页面模型的其余部分
谢谢,回答这个问题帮助我回答了这个问题。
基于的文档作为起点,我们能够生成一个利用现有Wagtail的自定义字段块
这个小部件为您完成了几乎所有的工作,它将为autocomplete拉入可用的标记,并将保存任何动态创建的新标记
可以读取这些标记,并使用型号@属性
或类似工具更方便地使用它们。记住Streamfields将数据存储为JSON,这样您就不会得到任何开箱即用的模型/数据库链接
局限性
需要注意的是,保存的标记被存储为原始字符串,这意味着如果您有一些更复杂的标记用例,那么您将需要做更多的工作来实现集成。e、 g.标记页面,显示所有使用该标记的页面或Wagtail的ModelAdmin
中的高级标记编辑
在这些情况下,您可以找到一种将页面标记与StreamField标记“同步”的方法,也可以将此工作抽象为mixin。或者,您也可以在标记页面上修改查询,以包括包含所需streamfield数据的查询
示例代码
来自itertools导入链的
来自django导入表单
从wagtail.admin.edit_handlers导入字段面板,StreamFieldPanel
从wagtail.admin.widgets导入AdminTagWidget
从wagtail.core.blocks导入CharBlock、FieldBlock、StructBlock、RichTextBlock
从wagtail.core.fields导入StreamField
从wagtail.core.models导入页面
类标记块(字段块):
"""
将使用Wagtail标记系统的基本流块。
仅将标记存储为简单字符串。
"""
定义初始化(self,required=False,help\u text=None,**kwargs):
#注意:如果要将此标记添加到现有streamfield,则-required=False很重要
self.field=forms.CharField(widget=AdminTagWidget,required=False)
超级()
类映射块(StructBlock):
title=CharBlock(label=“title”,必需=False)
content=RichTextBlock(label=“content”,required=False)
tags=TagsBlock(label=“tags”,required=False)
类元:
图标='站点'
类别位置第页(第页):
"""
特定位置的详细信息。
"""
# ... 其他领域
#这是添加的流字段
map_info=StreamField([('map',MapBlock(required=False))],blank=True)
@财产
def get