Как добавить изображение в RSS-канал синдикации Django - PullRequest
1 голос
/ 01 мая 2020

Имея эту модель:

class MyModel(models.Model):
    …
    image = StdImageField(
        upload_to="img/images",
        blank=True,
        variations={
            "large": (1024, 1024),
            "thumbnail": (150, 150, False),
            "medium": (600, 600),
        },
        delete_orphans=True,
    )

и этот вид

…
from django.contrib.syndication.views import Feed
…
class LatestItems(Feed):
    title = "LatestItems"
    description = "Latest Items"
    link = "/sitenews/"

    def items(self):
        return MyModel.objects.all()

    def item_title(self, item):
        return item.description_short

    def item_description(self, item):
        return item.description

    def item_link(self, item):
        return reverse('item_detail', args=[item.pk])

Как добавить изображение в тело RSS-статьи?

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Создайте пользовательский feed_type и установите его в представлении Feed,

from django.contrib.syndication.views import Feed
<b>from django.utils.feedgenerator import Rss201rev2Feed
from django.conf import settings


class CustomFeed(Rss201rev2Feed):
    def add_item_elements(self, handler, item):
        super().add_item_elements(handler, item)
        handler.addQuickElement("image", item["image"])</b>


class LatestItems(Feed):
    <b>feed_type = CustomFeed</b>
    title = "LatestItems"
    description = "Latest Items"
    link = "/sitenews/"

    def items(self):
        return MyModel.objects.all()

    def item_title(self, item):
        return item.description_short

    def item_description(self, item):
        return item.description

    def item_link(self, item):
        return reverse('item_detail', args=[item.pk])

    <b>def get_context_data(self, **kwargs):
        setattr(self, 'request', kwargs['request']) # to access the request object later
        return super().get_context_data(**kwargs)

    def item_extra_kwargs(self, item):
        img_url = item.image.url
        request_url = self.request.build_absolute_uri('/')[:-1]
        image_url_abs = f"{request_url}{settings.STATIC_URL}{img_url}"
        return {
            'image': image_url_abs
        }</b>

Результат

Result Screenshot

1 голос
/ 08 мая 2020

A - возможно, не технически лучший - подход, который до сих пор работает для меня, заключается в определении моего собственного шаблона. Даже если он не инкапсулирован в CDATA или с использованием тега enclosure из RSS, он корректно отображается в большинстве читателей RSS, которые я пробовал - так что ясность «работает для меня».

     description_template = "feeds/latest.html"

Шаблон представляет собой обычный Jinja-шаблон, который не поддерживает полный набор HTML. Тем не менее, для моего маленького проекта шаблон типа

<h1>{{ obj.description_short}}</h1>
<img src="{{request.scheme}}://{{request.META.HTTP_HOST}}{{obj.image.medium.url}}" />

(не устраивает построение URL, но это должно быть решаемо, например, с помощью идеи другого ответа

    def item_extra_kwargs(self, item):
       …

Так что мой полный вид выглядит примерно так:

class LatestFeed(Feed):
    title = "Latest Items"
    description = "Latest Items"
    link = "/"
    description_template = "feeds/latest.html"

    def items(self):
        return myModel.objects.all()

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return item.detail

    def item_link(self, item):
        return reverse('item_detail', args=[item.pk])
0 голосов
/ 03 мая 2020

Попробуйте это:

...

class LatestItems(Feed):
    ...

    def item_image(self, item):
        domain = 'https://example.com'
        return domain + item.image.url

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...