如何将图像添加到 Django 的 Syndication RSS-feed
How to add an image to Django's Syndication RSS-feed
拥有这个模型:
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 文章的正文中?
创建自定义 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>
结果
试试这个:
...
class LatestItems(Feed):
...
def item_image(self, item):
domain = 'https://example.com'
return domain + item.image.url
...
到目前为止对我有用的一个——也许在技术上不是最好的——方法是定义我自己的模板。即使它没有封装在 CDATA 中,也没有使用 RSS 的附件标签,它似乎在我试过的大多数 RSS reader 中都能正确呈现——如此清晰 "works for me".
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])
拥有这个模型:
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 文章的正文中?
创建自定义 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>
结果
试试这个:
...
class LatestItems(Feed):
...
def item_image(self, item):
domain = 'https://example.com'
return domain + item.image.url
...
到目前为止对我有用的一个——也许在技术上不是最好的——方法是定义我自己的模板。即使它没有封装在 CDATA 中,也没有使用 RSS 的附件标签,它似乎在我试过的大多数 RSS reader 中都能正确呈现——如此清晰 "works for me".
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])