Как мне изменить, как Wagtail подает медиа поверх своего API? - PullRequest
1 голос
/ 24 мая 2019

В настоящее время я пытаюсь создать веб-приложение, которое использует Django + Wagtail для своего внутреннего содержимого и React для внешнего интерфейса. На данный момент, при загрузке страницы, я запрашиваю все «статьи» из Wagtail через запрос http GET. Затем я отображаю эти данные в моих компонентах внешнего интерфейса.

Это сработало хорошо, за исключением одной проблемы, которая у меня возникла: медиа в теле статьи представлено в виде тега <embed /> с локальным источником. Вместо этого я хотел бы использовать тег <img /> с src, указывающим на URL-адрес, в котором хранится изображение. Как я могу изменить это на серверной части? Я не могу найти какую-либо документацию по этому вопросу.

Вот как выглядит мой ответ на запрос get:

{
    "id": 9,
    ...
    "title": "Child page",
    "date": null,
    "body": "<p>Here is a test image:</p><embed alt=\"testimg\" embedtype=\"image\" format=\"fullwidth\" id=\"5\"/><p></p>",
    "author": "Isaac"
}

Вот как бы я хотел, чтобы это выглядело:

{
    "id": 9,
    ...
    "title": "Child page",
    "date": null,
    "body": "<p>Here is a test image:</p><img src="image-location-url"/><p></p>",
    "author": "Isaac"
}

Как мне поступить об этом? Это можно контролировать с помощью настроек Wagtail? Или я должен как-то изменить свою модель контента? Спасибо.

1 Ответ

1 голос
/ 29 мая 2019

Скопировано прямо из комментария на странице Github (https://github.com/wagtail/wagtail/issues/2695#issuecomment-373002412):

from wagtail.wagtailcore.rich_text import expand_db_html


class APIRichTextField(APIField):
    def __init__(self, name):
        serializer = serializers.APIRichTextSerializer()
        super().__init__(name=name, serializer=serializer)


class APIRichTextSerializer(fields.CharField):
    def to_representation(self, instance):
        representation = super().to_representation(instance)
        return expand_db_html(representation)

class MyModel(Page):
    body = RichTextField()
    api_fields = [
        APIRichTextField('body'),
    ]

Теперь мое тело конвертируется непосредственно в HTML, который будет отображаться на конце трясогузки. Спасибо @solarissmoke за руководство. Еслиэтот ответ / вопрос не соответствует правилам, пожалуйста, дайте мне знать, и я с удовольствием удалю это.

...