简体   繁体   English

如何将图像添加到 Django 的 Syndication RSS-feed

[英]How to add an image to Django's Syndication RSS-feed

Having this model:拥有这个 model:

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,
    )

and this view而这个观点

…
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])

How to add an image to the body of an RSS-article?如何将图像添加到 RSS 文章的正文中?

Create a custom feed_type and set in the Feed view,创建自定义feed_type并在Feed视图中设置,

from django.contrib.syndication.views import Feed
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"])


class LatestItems(Feed):
    feed_type = CustomFeed
    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])

    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 }

Result结果

结果截图

A -- maybe not technically best -- approach that works so far for me is to define my own template.一个——也许在技术上不是最好的——到目前为止对我有用的方法是定义我自己的模板。 Even it's not encapslled in CDATA or using the enclosure-tag of RSS it appers to be rendered correctly in most of the RSS reader I'Ve tried -- so a clear "works for me".即使它没有封装在 CDATA 中或使用 RSS 的附件标签,它也可以在我尝试过的大多数 RSS 阅读器中正确呈现——所以一个明确的“对我有用”。

     description_template = "feeds/latest.html"

The template is a normal Jinja-template, which is not uspporting full set of HTML.模板为普通Jinja-template,不支持HTML全套。 However, for my little project a template like然而,对于我的小项目,一个模板像

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

(Not happy with the build of URL, but this should be solveable with eg the idea of another answer (对 URL 的构建不满意,但这应该可以通过例如另一个答案的想法来解决

    def item_extra_kwargs(self, item):
       …

So my complete view looks something like this:所以我的完整视图看起来像这样:

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])

Try this:尝试这个:

...

class LatestItems(Feed):
    ...

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

...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM