Django Rss Feed добавить изображение к описанию - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь использовать Django RSS-каналы для просмотра каналов в приложении rss viewer.

Я использовал django.contrib.syndication.views import Feed для создания RSS-каналов

, но он имел только 3 поля title , описание и ссылка я добавил пользовательские поля, используя django.utils.feedgenerator import Rss201rev2Feed

, и он генерирует дополнительные поля без проблем

enter image description here

но когда я открываю его с помощью программы просмотра RSS, он не показывает эти дополнительные поля или изображение

enter image description here

Мой вопрос: как я могу сделать эти дополнительные поля отображаются в приложении?

не отображается, потому что приложение показывает только заголовок, описание и ссылку , а остальные поля не обрабатываются?

так, как я могу вставить изображение и другие поля в описание, чтобы оно отображалось (самое главное, изображение отображается) ?

я много раз просматривал документацию не могу понять это правильно.

вот код вида из Django приложения

class CustomFeedGenerator(Rss201rev2Feed):
    def add_item_elements(self, handler, item):
        super(CustomFeedGenerator, self).add_item_elements(handler, item)
        handler.addQuickElement(u"image", item['image'])
        handler.addQuickElement(u"seller_name", item['seller_name'])
        handler.addQuickElement(u"price", item['price'])

class LatestPostsFeed(Feed):
    title = "www.marktplaats.nl"
    link = "/feeds/"
    description = "Updates on changes and additions to posts published in the starter."

    feed_type = CustomFeedGenerator

    def items(self):
        return Check_Ads_One.objects.order_by('title')[:5]

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

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

    def item_link(self, item):
        return item.prod_link

    def item_extra_kwargs(self, item):

        return { 'image': item.image_link,
                'seller_name' : item.seller_name,
                'price': item.price,}

Я использую Rs S Savvy для читателя приложение

1 Ответ

2 голосов
/ 17 февраля 2020

<image></image> не является стандартным элементом Товаров согласно указанной в спецификации RSS here. Но это действительный элемент channel. В любом случае, есть несколько способов добавить изображение в канал. Например:

Использование вложений

Как указано here, вы можете использовать корпуса для добавления изображения в канал. Django Feed Framework также предоставляет функцию add_enclosures(), которую мы можем использовать. Вот два возможных решения, основанные на этом:

Первое решение (изображение хранится в Django)

Я предполагаю, что у вас есть поле изображения в этой модели:

class Check_Ads_One(models.Model):
   image = models.ImageField()

Затем обновите класс LatestPostsFeed следующим образом:

class LatestPostsFeed(Feed):
    title = "www.marktplaats.nl"
    link = "/feeds/"
    description = "Updates on changes and additions to posts published in the starter."

    feed_type = feedgenerator.Rss201rev2Feed

    # Rest of the code

    def get_object(self, request, *args, **kwargs):
        self.request = request
        return super(LatestPostsFeed, self).get_object(request, *args, **kwargs) 

    def get_image_url(self, url):
        return self.request.build_absolute_uri('/media{}'.format(url))

    def item_enclosures(self, item):
        return [feedgenerator.Enclosure(self.get_image_url(item.image.url), str(item.image.size), 'image/{}'.format(item.image.name.split('.')[-1]))]

Второе решение (изображение не сохраняется в Django)

Если вы храните ссылки на изображение вместо фактическое изображение, затем используйте следующий подход:

import urllib

class LatestPostsFeed(Feed):
    title = "www.marktplaats.nl"
    link = "/feeds/"
    description = "Updates on changes and additions to posts published in the starter."

    feed_type = feedgenerator.Rss201rev2Feed

    # Rest of the code

    def get_size_and_type_of_image(self, image_url):
       # This method can be moved to models.py, and on save of `Check_Ads_One` it will calculate the size and type of image from url and store in DB. Then it will much optimized solution
       data = urllib.urlopen(image_url)
       return data['Content-Length'], data['Content-Type']

    def item_enclosures(self, item):
        content_length, content_type = self.get_size_and_type_of_image(item.image)
        return [feedgenerator.Enclosure(item.image, content_length, content_type)]

Информация об изображении в CDATA (альтернативное решение)

Вы можете добавить тег CDATA в описание и добавьте изображение туда:

def item_description(self, item):
    return return '<![CDATA[\n{} <img src="{}" alt="{}">\n]>'.format(item.paragraph, item.image, item.title)

Более подробную информацию можно найти в этом Ответе StackOverflow

...