【问题标题】:How to retrieve Page content from streamfield in Wagtail CMS?如何从 Wagtail CMS 的流场中​​检索页面内容?
【发布时间】:2019-08-12 04:25:06
【问题描述】:

我创建了SolutionPage,在它的content 字段里面有嵌套的short_portfolio 块。我已经通过 Wagtail 管理面板向 PageChooserBlock 添加了几个 ProjectPage 实例。

class SolutionPage(Page):
    ... 
    content = StreamField([
        ...
        ...
        ('short_portfolio', blocks.StructBlock([
            ('title', blocks.CharBlock(required=False)),
            ('description', blocks.RichTextBlock(required=True)),
            ('projects', blocks.StreamBlock([
                ('project', blocks.PageChooserBlock(ProjectPage)),
            ], required=False, max_num=4)),
        ])),
    ], blank=True, null=True, validators=[UniqueProjectsInShortPortfolioValidator()])   

现在,我正在开发用于 PDF 导出的 API 视图,并且我需要从给定的 SolutionPage 中提取所有 ProjectPage 对象

import requests
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render
from rest_framework import views
from rest_framework.generics import get_object_or_404

from portfolio.models import ProjectPage
from solutions.models import SolutionPage

class PortfolioToPdfView(views.APIView):
    def get(self, request, *args, **kwargs):
        def get_404():
            return HttpResponse(
                render(
                    request=None,
                    template_name='404.html',
                    content_type="text/html"
                ),
                content_type='text/html'
            )

        path = request.META['PATH_INFO']
        if path.find('solutions') == -1:
            return get_404()
        slug = path[path[1:].find('/') + 2:]
        slug = slug[:slug.find('/')]

        solution_page = get_object_or_404(SolutionPage, slug=slug)
        short_portfolio = solution_page.content.stream_block.child_blocks["short_portfolio"]

        projects = [project.child_blocks["project"].target_model for project in short_portfolio.child_blocks["projects"]]

        ...
        response = HttpResponse(request, content_type='application/pdf')
        return response

问题在于,这样我只能提取页面“模式”之类的内容,而不能提取实际内容。

TypeError at /solutions/ai-driven-machine-learning-software/portfolio-pdf/
'StreamBlock' object is not iterable

Debug variables

【问题讨论】:

    标签: python django web-applications content-management-system wagtail


    【解决方案1】:

    solution_page.content.stream_block.child_blocks["short_portfolio"] 将为您提供short_portfolio 块的定义,而不是该块的特定实例。为此,您需要遍历字段内容,寻找与 block_type 匹配的块:

    projects = []
    for block in solution_page.content:
        if block.block_type == 'short_portfolio':
            for project_block in block.value['projects']:
                projects.append(project_block.value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多