feat: add products/cases page models and forms lead-capture app
- apps/products: ProductIndexPage/ProductPage - apps/cases: CaseStudyIndexPage/CaseStudyPage - apps/forms: FormDefinition/FormDefinitionField/Lead + submit API - core/blocks: CaseStudyBlock, FormBlock (with API representation) - register new apps, custom leads API route, migrations
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from wagtail import blocks
|
||||
from wagtail.images.blocks import ImageChooserBlock
|
||||
from wagtail.snippets.blocks import SnippetChooserBlock
|
||||
|
||||
|
||||
class CTAButtonBlock(blocks.StructBlock):
|
||||
@@ -97,6 +98,59 @@ class LogoCloudBlock(blocks.StructBlock):
|
||||
template = "core/blocks/logo_cloud_block.html"
|
||||
|
||||
|
||||
class CaseStudyBlock(blocks.StructBlock):
|
||||
case_page = blocks.PageChooserBlock(
|
||||
page_type="cases.CaseStudyPage", label=_("案例页面")
|
||||
)
|
||||
summary = blocks.CharBlock(max_length=250, required=False, label=_("摘要覆盖"))
|
||||
|
||||
class Meta:
|
||||
icon = "doc-full"
|
||||
label = _("客户案例卡片")
|
||||
|
||||
|
||||
class FormBlock(blocks.StructBlock):
|
||||
"""嵌入可复用的线索表单(apps.forms.FormDefinition Snippet)。"""
|
||||
|
||||
form = SnippetChooserBlock("forms.FormDefinition", label=_("选择表单"))
|
||||
|
||||
class Meta:
|
||||
icon = "form"
|
||||
label = _("线索表单")
|
||||
|
||||
def get_api_representation(self, value, context=None):
|
||||
"""
|
||||
默认 SnippetChooserBlock 只会序列化为主键,前端渲染动态表单需要完整字段定义,
|
||||
因此这里手动展开 FormDefinition 及其子字段(详见 apps/forms/models.py)。
|
||||
"""
|
||||
form_def = value.get("form")
|
||||
if form_def is None:
|
||||
return {"form": None}
|
||||
return {
|
||||
"form": {
|
||||
"id": form_def.pk,
|
||||
"name": form_def.name,
|
||||
"submit_button_text": form_def.submit_button_text,
|
||||
"success_message": form_def.success_message,
|
||||
"fields": [
|
||||
{
|
||||
"label": field.label,
|
||||
"field_key": field.field_key,
|
||||
"field_type": field.field_type,
|
||||
"required": field.required,
|
||||
"choices": [
|
||||
choice.strip()
|
||||
for choice in field.choices.split(",")
|
||||
if choice.strip()
|
||||
],
|
||||
}
|
||||
for field in form_def.fields.all()
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
COMMON_BLOCKS = [
|
||||
("hero", HeroBlock()),
|
||||
("stats", StatsBlock()),
|
||||
@@ -104,5 +158,7 @@ COMMON_BLOCKS = [
|
||||
("faq", FAQBlock()),
|
||||
("cta", CTABlock()),
|
||||
("logo_cloud", LogoCloudBlock()),
|
||||
("case_study", CaseStudyBlock()),
|
||||
("form", FormBlock()),
|
||||
("richtext", blocks.RichTextBlock(label=_("富文本"))),
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user