diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/urls.py b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/urls.py index adf2703..44bb441 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/urls.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/urls.py @@ -1,3 +1,113 @@ +<<<<<<< HEAD +# 导入 Django 内置的路径配置工具和缓存装饰器 +from django.urls import path +from django.views.decorators.cache import cache_page + +# 导入当前应用(blog)的视图模块,用于关联路由与视图逻辑 +from . import views + +# 定义应用命名空间(namespace),用于在模板或反向解析时区分不同应用的路由 +# 例如:在模板中使用 {% url 'blog:index' %} 生成首页链接 +app_name = "blog" + +# 路由配置列表,每个 path 对应一个 URL 规则与视图的映射 +urlpatterns = [ + # 首页路由:匹配根路径(网站域名/) + path( + r'', # URL 路径表达式,空字符串表示根路径 + views.IndexView.as_view(), # 关联的视图类(IndexView),通过 as_view() 转换为可调用视图 + name='index' # 路由名称,用于反向解析(如 reverse('blog:index')) + ), + + # 分页首页路由:匹配带页码的首页(如 /page/2/) + path( + r'page//', # 是路径参数,int 表示接收整数类型,page 是参数名 + views.IndexView.as_view(), # 复用首页视图类,视图中会通过 page 参数处理分页 + name='index_page' + ), + + # 文章详情页路由:按日期和文章ID匹配(如 /article/2023/10/20/100.html) + path( + r'article////.html', + # 路径参数:year(年)、month(月)、day(日)、article_id(文章ID),均为整数 + views.ArticleDetailView.as_view(), # 文章详情视图类,处理文章展示逻辑 + name='detailbyid' + ), + + # 分类详情页路由:按分类名匹配(如 /category/tech.html) + path( + r'category/.html', + # :slug 类型表示接收字母、数字、下划线和连字符组成的字符串(适合URL友好的名称) + views.CategoryDetailView.as_view(), # 分类详情视图类,展示该分类下的文章 + name='category_detail' + ), + + # 分类详情分页路由:带页码的分类页(如 /category/tech/2.html) + path( + r'category//.html', + views.CategoryDetailView.as_view(), # 复用分类视图类,通过 page 参数分页 + name='category_detail_page' + ), + + # 作者详情页路由:按作者名匹配(如 /author/alice.html) + path( + r'author/.html', + # :未指定类型,默认接收字符串(除特殊字符外) + views.AuthorDetailView.as_view(), # 作者详情视图类,展示该作者的文章 + name='author_detail' + ), + + # 作者详情分页路由:带页码的作者页(如 /author/alice/2.html) + path( + r'author//.html', + views.AuthorDetailView.as_view(), # 复用作者视图类,通过 page 参数分页 + name='author_detail_page' + ), + + # 标签详情页路由:按标签名匹配(如 /tag/python.html) + path( + r'tag/.html', + views.TagDetailView.as_view(), # 标签详情视图类,展示该标签下的文章 + name='tag_detail' + ), + + # 标签详情分页路由:带页码的标签页(如 /tag/python/2.html) + path( + r'tag//.html', + views.TagDetailView.as_view(), # 复用标签视图类,通过 page 参数分页 + name='tag_detail_page' + ), + + # 归档页路由:匹配 /archives.html + path( + 'archives.html', + # 缓存装饰器:cache_page(60*60) 表示缓存该页面1小时(60秒*60),减轻服务器压力 + cache_page(60 * 60)(views.ArchivesView.as_view()), + name='archives' # 归档视图,通常展示按日期分组的文章列表 + ), + + # 友情链接页路由:匹配 /links.html + path( + 'links.html', + views.LinkListView.as_view(), # 友情链接视图类,展示网站链接列表 + name='links' + ), + + # 文件上传路由:匹配 /upload + path( + r'upload', + views.fileupload, # 关联函数视图(非类视图),处理文件上传逻辑 + name='upload' + ), + + # 缓存清理路由:匹配 /clean + path( + r'clean', + views.clean_cache_view, # 关联缓存清理视图,用于手动触发缓存清理 + name='clean' + ), +] +======= from django.urls import path from django.views.decorators.cache import cache_page @@ -60,3 +170,4 @@ urlpatterns = [ views.clean_cache_view, name='clean'), ] +>>>>>>> ccy_branch diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py b/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py index 7c3bbc8..796d1cc 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py @@ -8,32 +8,46 @@ from blog.models import Article # Create your models here. +#ccy: 评论模块 - 定义博客文章的评论数据模型,支持多级回复功能 class Comment(models.Model): + #ccy: 评论正文内容,最大长度300字符 body = models.TextField('正文', max_length=300) + #ccy: 评论创建时间,自动设置为当前时间 creation_time = models.DateTimeField(_('creation time'), default=now) + #ccy: 评论最后修改时间,自动更新为当前时间 last_modify_time = models.DateTimeField(_('last modify time'), default=now) + #ccy: 评论作者,关联用户模型,删除用户时级联删除其评论 author = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_('author'), on_delete=models.CASCADE) + #ccy: 所属文章,关联文章模型,删除文章时级联删除相关评论 article = models.ForeignKey( Article, verbose_name=_('article'), on_delete=models.CASCADE) + #ccy: 父级评论,支持评论回复功能,允许为空表示顶级评论 parent_comment = models.ForeignKey( 'self', verbose_name=_('parent comment'), blank=True, null=True, on_delete=models.CASCADE) + #ccy: 评论启用状态,控制评论是否可见 is_enable = models.BooleanField(_('enable'), default=False, blank=False, null=False) + #ccy: Meta类 - 定义评论模型的元数据配置 class Meta: + #ccy: 按ID降序排列,新的评论显示在前面 ordering = ['-id'] + #ccy: 单数模型名称 verbose_name = _('comment') + #ccy: 复数模型名称 verbose_name_plural = verbose_name + #ccy: 指定获取最新记录的依据字段 get_latest_by = 'id' + #ccy: 字符串表示方法,返回评论正文内容 def __str__(self): - return self.body + return self.body \ No newline at end of file