Как получить URL-адрес изображения или загрузить URL-адрес изображений в API страниц, где изображение создается потоком? - PullRequest
3 голосов
/ 07 октября 2019

В моем приложении wagtail у меня есть поле потока, которое используется для загрузки изображения с использованием ImageChooserBlock вместе с заголовком и текстом. Это означает, что в единственном поле потока у меня есть заголовок, текст и вход для загрузки изображения. Я пытаюсь получить URL изображения в API страниц остального фреймворка (localhost:8000/api/v2/pages/[page-id]). Но эти страницы API только дает идентификатор изображения загруженных изображений следующим образом

{
    "type": "avengers",
    "value": {
        "title": "Tony Stark",
        "avengers": [
            {
                "image": 1,            /******* this is the image id returned ********/
                "title": "Iron Man",
                "text": "Iron man is now in framework"
            }
        ]
    },
    "id": "2f27cb24"
} 

Если я получаю доступ к изображениям API (http://localhost:8000/api/v2/images/1/), я получаю download_url следующим образом

{
    "id": 1,
    "meta": {
        "type": "wagtailimages.Image",
        "detail_url": "http://localhost/api/v2/images/1/",
        "tags": [],
        "download_url": "/media/original_images/avenger.jpeg"
    },
    "title": "avenger.jpeg",
    "width": 400,
    "height": 400
}

У меня вопрос, как я могу получить download_url или URL-адрес изображения в API страниц (localhost:8000/api/v2/pages/[page-id])

Мой streamfields blocks.py для блока Мстители выглядит следующим образом

class AvengersBlock(blocks.StructBlock):

    title = blocks.CharBlock(required=True, help_text="Add your title")

    Avengers = blocks.ListBlock(
        blocks.StructBlock(
            [
                ("image", ImageChooserBlock(required=True)),
                ("title", blocks.CharBlock(required=True, max_length=40)),
                ("text", blocks.TextBlock(required=True, max_length=200))
            ]
        )
    )

    class Meta:  # noqa
        template = "streams/Avengers_block.html"
        icon = "placeholder"
        label = "Avengers"

Это поле потока используется в типах содержимого model.py следующим образом

from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel
from wagtail.core.fields import StreamField
from wagtail.core.models import Page
from wagtail.api import APIField

from apps.common.streams import blocks

class AvengersPage(Page):

    tempalte = "avengers/avengers_page.html"  

    content = StreamField(
        [
            ("avengers", blocks.AvengersBlock())
        ],
        null=True,
        blank=True,
    )

    subtitle = models.CharField(max_length=100, null=True, blank=True)

    content_panels = Page.content_panels + [
        FieldPanel("subtitle"),
        StreamFieldPanel("content"),
    ]

    api_fields = [
        APIField("subtitle"),
        APIField("content")
    ]

    class Meta:  # noqa

        verbose_name = "Avengers Page"   

1 Ответ

0 голосов
/ 15 октября 2019

Добавьте это в свой AvengersBlock, и когда вы позвоните своему API по адресу

/ api / v2 / pages /? Type = home.AvengersPage & fields = content

, вы должны увидеть JSON, который выищу.


def get_api_representation(self, value, context=None):
        """ Recursively call get_api_representation on children and return as a plain dict """
        dict_list = []
        for item in value["Avengers"]:
            temp_dict = {
                'title': item.get("title"),
                'text': item.get("text"),
                'image_url': item.get("image").file.url
                # any other relevant fields of your model...
            }
            dict_list.append(temp_dict)

        return dict_list

...