|
|
|
|
@ -1,40 +1,61 @@
|
|
|
|
|
# 导入 Django 用户模型工具:获取当前项目的用户模型(支持自定义用户模型)
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
# 导入 Django 内置的 Feed 基类:用于快速实现 RSS/Atom 订阅功能
|
|
|
|
|
from django.contrib.syndication.views import Feed
|
|
|
|
|
# 导入 Django 时间工具:处理时区和当前时间
|
|
|
|
|
from django.utils import timezone
|
|
|
|
|
# 导入 RSS 2.0 格式生成器:指定 Feed 输出格式为 RSS 2.0 标准
|
|
|
|
|
from django.utils.feedgenerator import Rss201rev2Feed
|
|
|
|
|
|
|
|
|
|
# 导入博客核心模型和工具:关联文章数据及 Markdown 解析
|
|
|
|
|
from blog.models import Article
|
|
|
|
|
from djangoblog.utils import CommonMarkdown
|
|
|
|
|
from djangoblog.utils import CommonMarkdown # 自定义 Markdown 解析工具(将文章内容转为 HTML)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 自定义 RSS Feed 类:继承 Django 内置 Feed 类,实现博客文章的订阅功能
|
|
|
|
|
class DjangoBlogFeed(Feed):
|
|
|
|
|
# 指定 Feed 生成器类型:使用 RSS 2.0 标准格式(最常用的 RSS 版本)
|
|
|
|
|
feed_type = Rss201rev2Feed
|
|
|
|
|
|
|
|
|
|
# Feed 描述信息:显示在订阅源的说明中
|
|
|
|
|
description = '大巧无工,重剑无锋.'
|
|
|
|
|
# Feed 标题:订阅源的名称(通常为博客名称)
|
|
|
|
|
title = "且听风吟 大巧无工,重剑无锋. "
|
|
|
|
|
# Feed 的链接:订阅源自身的 URL(通常指向博客首页或 Feed 专属页面)
|
|
|
|
|
link = "/feed/"
|
|
|
|
|
|
|
|
|
|
# 订阅源作者名称:从系统第一个用户的昵称获取(适合个人博客)
|
|
|
|
|
def author_name(self):
|
|
|
|
|
return get_user_model().objects.first().nickname
|
|
|
|
|
|
|
|
|
|
# 订阅源作者链接:指向作者的个人页面(通过用户模型的 get_absolute_url 方法获取)
|
|
|
|
|
def author_link(self):
|
|
|
|
|
return get_user_model().objects.first().get_absolute_url()
|
|
|
|
|
|
|
|
|
|
# 订阅源包含的项目(文章):定义要展示在 Feed 中的内容
|
|
|
|
|
def items(self):
|
|
|
|
|
# 筛选条件:类型为文章(type='a')、状态为已发布(status='p')
|
|
|
|
|
# 排序规则:按发布时间倒序(最新发布的文章在前)
|
|
|
|
|
# 数量限制:只显示最新的 5 篇文章
|
|
|
|
|
return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]
|
|
|
|
|
|
|
|
|
|
# 单个项目(文章)的标题:使用文章自身的标题
|
|
|
|
|
def item_title(self, item):
|
|
|
|
|
return item.title
|
|
|
|
|
|
|
|
|
|
# 单个项目(文章)的描述:将 Markdown 格式的文章内容转为 HTML 后展示
|
|
|
|
|
def item_description(self, item):
|
|
|
|
|
return CommonMarkdown.get_markdown(item.body)
|
|
|
|
|
return CommonMarkdown.get_markdown(item.body) # 调用工具类解析 Markdown
|
|
|
|
|
|
|
|
|
|
# 订阅源的版权信息:动态生成包含当前年份的版权声明
|
|
|
|
|
def feed_copyright(self):
|
|
|
|
|
now = timezone.now()
|
|
|
|
|
return "Copyright© {year} 且听风吟".format(year=now.year)
|
|
|
|
|
now = timezone.now() # 获取当前时间(带时区)
|
|
|
|
|
return "Copyright© {year} 且听风吟".format(year=now.year) # 格式化版权信息
|
|
|
|
|
|
|
|
|
|
# 单个项目(文章)的链接:指向文章详情页(通过文章模型的 get_absolute_url 方法获取)
|
|
|
|
|
def item_link(self, item):
|
|
|
|
|
return item.get_absolute_url()
|
|
|
|
|
|
|
|
|
|
# 单个项目(文章)的唯一标识(GUID):此处留空,Django 会默认使用 item_link 作为 GUID
|
|
|
|
|
def item_guid(self, item):
|
|
|
|
|
return
|
|
|
|
|
return
|