|
|
|
|
@ -3,33 +3,47 @@ from django.conf import settings # 新增导入
|
|
|
|
|
|
|
|
|
|
class Category(models.Model):
|
|
|
|
|
"""非遗分类"""
|
|
|
|
|
# HJH:分类名称字段,最大长度100字符,必须唯一,用于后台显示名称
|
|
|
|
|
name = models.CharField(max_length=100, unique=True, verbose_name="分类名称")
|
|
|
|
|
# HJH:分类描述字段,Text类型允许长文本,blank=True表示可为空
|
|
|
|
|
description = models.TextField(blank=True, verbose_name="分类描述")
|
|
|
|
|
# HJH:分类图标字段,存储图标字符或表情,默认使用🏮表情
|
|
|
|
|
icon = models.CharField(max_length=50, default="🏮", verbose_name="分类图标")
|
|
|
|
|
# HJH:显示顺序字段,整数类型,用于控制分类在前端的显示顺序
|
|
|
|
|
order = models.IntegerField(default=0, verbose_name="显示顺序")
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
# HJH:设置模型在Django管理后台的单数显示名称
|
|
|
|
|
verbose_name = "非遗分类"
|
|
|
|
|
# HJH:设置模型在Django管理后台的复数显示名称
|
|
|
|
|
verbose_name_plural = "非遗分类"
|
|
|
|
|
# HJH:默认按order字段升序排列,数字小的排在前面
|
|
|
|
|
ordering = ['order']
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
# HJH:定义对象的字符串表示形式,在管理后台和shell中显示分类名称
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
class PrimaryTag(models.Model):
|
|
|
|
|
"""一级标签"""
|
|
|
|
|
# HJH:一级标签名称字段,最大长度100字符,必须唯一
|
|
|
|
|
name = models.CharField(max_length=100, unique=True, verbose_name="标签名称")
|
|
|
|
|
# HJH:标签颜色字段,存储十六进制颜色值,默认值为棕色#8b4513
|
|
|
|
|
color = models.CharField(max_length=7, default="#8b4513", verbose_name="标签颜色")
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
# HJH:设置模型在Django管理后台的单数显示名称
|
|
|
|
|
verbose_name = "一级标签"
|
|
|
|
|
# HJH:设置模型在Django管理后台的复数显示名称
|
|
|
|
|
verbose_name_plural = "一级标签"
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
# HJH:定义对象的字符串表示形式,返回标签名称
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
class SecondaryTag(models.Model):
|
|
|
|
|
"""二级标签"""
|
|
|
|
|
# HJH:定义二级标签的类型选择项,每个元组包含(数据库值, 显示名称)
|
|
|
|
|
TAG_TYPE_CHOICES = [
|
|
|
|
|
('geo', '地理空间'),
|
|
|
|
|
('theme', '主题维度'),
|
|
|
|
|
@ -38,41 +52,64 @@ class SecondaryTag(models.Model):
|
|
|
|
|
('time', '时间节庆'),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# HJH:二级标签名称字段,最大长度100字符
|
|
|
|
|
name = models.CharField(max_length=100, verbose_name="标签名称")
|
|
|
|
|
# HJH:标签类型字段,使用预定义的选择项,max_length=20足够存储所有选项
|
|
|
|
|
tag_type = models.CharField(max_length=20, choices=TAG_TYPE_CHOICES, verbose_name="标签类型")
|
|
|
|
|
# HJH:外键关联到一级标签,on_delete=CASCADE表示父标签删除时子标签也删除
|
|
|
|
|
parent_tag = models.ForeignKey(PrimaryTag, on_delete=models.CASCADE, null=True, blank=True, verbose_name="父级标签")
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
# HJH:设置模型在Django管理后台的单数显示名称
|
|
|
|
|
verbose_name = "二级标签"
|
|
|
|
|
# HJH:设置模型在Django管理后台的复数显示名称
|
|
|
|
|
verbose_name_plural = "二级标签"
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
# HJH:定义对象的字符串表示形式,返回标签名称和类型显示名称
|
|
|
|
|
return f"{self.name} ({self.get_tag_type_display()})"
|
|
|
|
|
|
|
|
|
|
class Post(models.Model):
|
|
|
|
|
"""非遗文章"""
|
|
|
|
|
# HJH:定义文章状态的选择项,用于status字段
|
|
|
|
|
STATUS_CHOICES = [
|
|
|
|
|
('draft', '草稿'),
|
|
|
|
|
('published', '已发布'),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# HJH:文章标题字段,最大长度200字符
|
|
|
|
|
title = models.CharField(max_length=200, verbose_name="文章标题")
|
|
|
|
|
# HJH:文章内容字段,Text类型支持长文本内容
|
|
|
|
|
content = models.TextField(verbose_name="文章内容")
|
|
|
|
|
# HJH:文章摘要字段,最大长度300字符,blank=True表示可为空
|
|
|
|
|
excerpt = models.TextField(max_length=300, blank=True, verbose_name="文章摘要")
|
|
|
|
|
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="作者") # 修改这行
|
|
|
|
|
# HJH:外键关联到用户模型,使用Django设置中的AUTH_USER_MODEL确保兼容性
|
|
|
|
|
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="作者")
|
|
|
|
|
# HJH:外键关联到分类模型,文章必须属于一个分类
|
|
|
|
|
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="分类")
|
|
|
|
|
# HJH:多对多关联到一级标签,blank=True表示可以为空标签集合
|
|
|
|
|
primary_tags = models.ManyToManyField(PrimaryTag, blank=True, verbose_name="一级标签")
|
|
|
|
|
# HJH:多对多关联到二级标签,blank=True表示可以为空标签集合
|
|
|
|
|
secondary_tags = models.ManyToManyField(SecondaryTag, blank=True, verbose_name="二级标签")
|
|
|
|
|
# HJH:特色图片字段,图片上传到posts/年/月/目录,可为空
|
|
|
|
|
featured_image = models.ImageField(upload_to='posts/%Y/%m/', blank=True, null=True, verbose_name="特色图片")
|
|
|
|
|
# HJH:阅读量字段,PositiveIntegerField确保非负整数,默认值为0
|
|
|
|
|
views = models.PositiveIntegerField(default=0, verbose_name="阅读量")
|
|
|
|
|
# HJH:文章状态字段,使用选择项,默认状态为'published'已发布
|
|
|
|
|
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='published', verbose_name="状态")
|
|
|
|
|
# HJH:创建时间字段,auto_now_add=True在对象创建时自动设置当前时间
|
|
|
|
|
created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
|
|
|
|
# HJH:更新时间字段,auto_now=True在对象保存时自动更新为当前时间
|
|
|
|
|
updated_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
# HJH:设置模型在Django管理后台的单数显示名称
|
|
|
|
|
verbose_name = "非遗文章"
|
|
|
|
|
# HJH:设置模型在Django管理后台的复数显示名称
|
|
|
|
|
verbose_name_plural = "非遗文章"
|
|
|
|
|
# HJH:默认按创建时间降序排列,最新的文章显示在最前面
|
|
|
|
|
ordering = ['-created_time']
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.title
|
|
|
|
|
# HJH:定义对象的字符串表示形式,返回文章标题
|
|
|
|
|
return self.title
|