@ -14,363 +14,363 @@ from uuslug import slugify
from djangoblog . utils import cache_decorator , cache
from djangoblog . utils import get_current_site
logger = logging . getLogger ( __name__ )
logger = logging . getLogger ( __name__ ) #ZNY 获取当前模块的日志记录器
class LinkShowType ( models . TextChoices ) :
I = ( ' i ' , _ ( ' index ' ) )
L = ( ' l ' , _ ( ' list ' ) )
P = ( ' p ' , _ ( ' post ' ) )
A = ( ' a ' , _ ( ' all ' ) )
S = ( ' s ' , _ ( ' slide ' ) )
class LinkShowType ( models . TextChoices ) : #ZNY 定义链接显示类型枚举类
I = ( ' i ' , _ ( ' index ' ) ) #ZNY 首页显示
L = ( ' l ' , _ ( ' list ' ) ) #ZNY 列表页显示
P = ( ' p ' , _ ( ' post ' ) ) #ZNY 文章页面显示
A = ( ' a ' , _ ( ' all ' ) ) #ZNY 全站显示
S = ( ' s ' , _ ( ' slide ' ) ) #ZNY 友情链接页面显示
class BaseModel ( models . Model ) :
id = models . AutoField ( primary_key = True )
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now )
last_modify_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now )
class BaseModel ( models . Model ) : #ZNY 定义基础模型抽象类
id = models . AutoField ( primary_key = True ) #ZNY 自增主键字段
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now ) #ZNY 创建时间字段
last_modify_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now ) #ZNY 最后修改时间字段
def save ( self , * args , * * kwargs ) :
is_update_views = isinstance (
def save ( self , * args , * * kwargs ) : #ZNY 重写保存方法
is_update_views = isinstance ( #ZNY 检查是否是更新文章浏览量的操作
self ,
Article ) and ' update_fields ' in kwargs and kwargs [ ' update_fields ' ] == [ ' views ' ]
if is_update_views :
Article . objects . filter ( pk = self . pk ) . update ( views = self . views )
else :
if ' slug ' in self . __dict__ :
slug = getattr (
if is_update_views : #ZNY 如果是更新浏览量
Article . objects . filter ( pk = self . pk ) . update ( views = self . views ) #ZNY 直接更新浏览量字段
else : #ZNY 如果不是更新浏览量
if ' slug ' in self . __dict__ : #ZNY 如果模型有slug字段
slug = getattr ( #ZNY 获取标题或名称作为slug源
self , ' title ' ) if ' title ' in self . __dict__ else getattr (
self , ' name ' )
setattr ( self , ' slug ' , slugify ( slug ) )
super ( ) . save ( * args , * * kwargs )
setattr ( self , ' slug ' , slugify ( slug ) ) #ZNY 生成并设置slug字段
super ( ) . save ( * args , * * kwargs ) #ZNY 调用父类保存方法
def get_full_url ( self ) :
site = get_current_site ( ) . domain
url = " https:// {site} {path} " . format ( site = site ,
def get_full_url ( self ) : #ZNY 获取完整URL方法
site = get_current_site ( ) . domain #ZNY 获取当前站点域名
url = " https:// {site} {path} " . format ( site = site , #ZNY 构建完整URL
path = self . get_absolute_url ( ) )
return url
return url #ZNY 返回完整URL
class Meta :
abstract = True
abstract = True #ZNY 设置为抽象基类,不创建数据库表
@abstractmethod
def get_absolute_url ( self ) :
pass
@abstractmethod #ZNY 抽象方法,子类必须实现
def get_absolute_url ( self ) : #ZNY 获取绝对URL方法
pass #ZNY 由子类具体实现
class Article ( BaseModel ) :
""" 文章 """
STATUS_CHOICES = (
( ' d ' , _ ( ' Draft ' ) ) ,
( ' p ' , _ ( ' Published ' ) ) ,
class Article ( BaseModel ) : #ZNY 定义文章模型,继承基础模型
""" 文章 """ #ZNY 文章模型文档字符串
STATUS_CHOICES = ( #ZNY 文章状态选项
( ' d ' , _ ( ' Draft ' ) ) , #ZNY 草稿状态
( ' p ' , _ ( ' Published ' ) ) , #ZNY 发布状态
)
COMMENT_STATUS = (
( ' o ' , _ ( ' Open ' ) ) ,
( ' c ' , _ ( ' Close ' ) ) ,
COMMENT_STATUS = ( #ZNY 评论状态选项
( ' o ' , _ ( ' Open ' ) ) , #ZNY 开放评论
( ' c ' , _ ( ' Close ' ) ) , #ZNY 关闭评论
)
TYPE = (
( ' a ' , _ ( ' Article ' ) ) ,
( ' p ' , _ ( ' Page ' ) ) ,
TYPE = ( #ZNY 文章类型选项
( ' a ' , _ ( ' Article ' ) ) , #ZNY 普通文章
( ' p ' , _ ( ' Page ' ) ) , #ZNY 页面类型
)
title = models . CharField ( _ ( ' title ' ) , max_length = 200 , unique = True )
body = MDTextField ( _ ( ' body ' ) )
pub_time = models . DateTimeField (
title = models . CharField ( _ ( ' title ' ) , max_length = 200 , unique = True ) #ZNY 文章标题,唯一
body = MDTextField ( _ ( ' body ' ) ) #ZNY 文章正文, 使用Markdown字段
pub_time = models . DateTimeField ( #ZNY 发布时间字段
_ ( ' publish time ' ) , blank = False , null = False , default = now )
status = models . CharField (
status = models . CharField ( #ZNY 文章状态字段
_ ( ' status ' ) ,
max_length = 1 ,
choices = STATUS_CHOICES ,
default = ' p ' )
comment_status = models . CharField (
default = ' p ' ) #ZNY 默认发布状态
comment_status = models . CharField ( #ZNY 评论状态字段
_ ( ' comment status ' ) ,
max_length = 1 ,
choices = COMMENT_STATUS ,
default = ' o ' )
type = models . CharField ( _ ( ' type ' ) , max_length = 1 , choices = TYPE , default = ' a ' )
views = models . PositiveIntegerField ( _ ( ' views ' ) , default = 0 )
author = models . ForeignKey (
default = ' o ' ) #ZNY 默认开放评论
type = models . CharField ( _ ( ' type ' ) , max_length = 1 , choices = TYPE , default = ' a ' ) #ZNY 文章类型,默认普通文章
views = models . PositiveIntegerField ( _ ( ' views ' ) , default = 0 ) #ZNY 浏览量统计字段
author = models . ForeignKey ( #ZNY 作者外键字段
settings . AUTH_USER_MODEL ,
verbose_name = _ ( ' author ' ) ,
blank = False ,
null = False ,
on_delete = models . CASCADE )
article_order = models . IntegerField (
_ ( ' order ' ) , blank = False , null = False , default = 0 )
show_toc = models . BooleanField ( _ ( ' show toc ' ) , blank = False , null = False , default = False )
category = models . ForeignKey (
on_delete = models . CASCADE ) #ZNY 级联删除
article_order = models . IntegerField ( #ZNY 文章排序字段
_ ( ' order ' ) , blank = False , null = False , default = 0 ) #ZNY 数字越大越靠前
show_toc = models . BooleanField ( _ ( ' show toc ' ) , blank = False , null = False , default = False ) #ZNY 是否显示目录
category = models . ForeignKey ( #ZNY 分类外键字段
' Category ' ,
verbose_name = _ ( ' category ' ) ,
on_delete = models . CASCADE ,
blank = False ,
null = False )
tags = models . ManyToManyField ( ' Tag ' , verbose_name = _ ( ' tag ' ) , blank = True )
null = False ) #ZNY 必须选择分类
tags = models . ManyToManyField ( ' Tag ' , verbose_name = _ ( ' tag ' ) , blank = True ) #ZNY 标签多对多关系
def body_to_string ( self ) :
return self . body
def body_to_string ( self ) : #ZNY 获取正文字符串方法
return self . body #ZNY 返回正文内容
def __str__ ( self ) :
return self . title
def __str__ ( self ) : #ZNY 字符串表示方法
return self . title #ZNY 返回文章标题
class Meta :
ordering = [ ' -article_order ' , ' -pub_time ' ]
verbose_name = _ ( ' article ' )
verbose_name_plural = verbose_name
get_latest_by = ' id '
ordering = [ ' -article_order ' , ' -pub_time ' ] #ZNY 默认按排序和发布时间降序排列
verbose_name = _ ( ' article ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
get_latest_by = ' id ' #ZNY 获取最新记录的依据字段
def get_absolute_url ( self ) :
return reverse ( ' blog:detailbyid ' , kwargs = {
def get_absolute_url ( self ) : #ZNY 实现获取绝对URL方法
return reverse ( ' blog:detailbyid ' , kwargs = { #ZNY 生成文章详情页URL
' article_id ' : self . id ,
' year ' : self . creation_time . year ,
' month ' : self . creation_time . month ,
' day ' : self . creation_time . day
} )
@cache_decorator ( 60 * 60 * 10 )
def get_category_tree ( self ) :
tree = self . category . get_category_tree ( )
names = list ( map ( lambda c : ( c . name , c . get_absolute_url ( ) ) , tree ) )
return names
def save ( self , * args , * * kwargs ) :
super ( ) . save ( * args , * * kwargs )
def viewed ( self ) :
self . views + = 1
self . save ( update_fields = [ ' views ' ] )
def comment_list ( self ) :
cache_key = ' article_comments_ {id} ' . format ( id = self . id )
value = cache . get ( cache_key )
if value :
logger . info ( ' get article comments: {id} ' . format ( id = self . id ) )
return value
else :
comments = self . comment_set . filter ( is_enable = True ) . order_by ( ' -id ' )
cache . set ( cache_key , comments , 60 * 100 )
logger . info ( ' set article comments: {id} ' . format ( id = self . id ) )
return comments
def get_admin_url ( self ) :
info = ( self . _meta . app_label , self . _meta . model_name )
return reverse ( ' admin: %s _ %s _change ' % info , args = ( self . pk , ) )
@cache_decorator ( expiration = 60 * 100 )
def next_article ( self ) :
@cache_decorator ( 60 * 60 * 10 ) #ZNY 缓存装饰器, 缓存10小时
def get_category_tree ( self ) : #ZNY 获取分类树方法
tree = self . category . get_category_tree ( ) #ZNY 获取分类的层级树
names = list ( map ( lambda c : ( c . name , c . get_absolute_url ( ) ) , tree ) ) #ZNY 转换为名称和URL的元组列表
return names #ZNY 返回分类树列表
def save ( self , * args , * * kwargs ) : #ZNY 重写保存方法
super ( ) . save ( * args , * * kwargs ) #ZNY 调用父类保存方法
def viewed ( self ) : #ZNY 增加浏览量方法
self . views + = 1 #ZNY 浏览量加1
self . save ( update_fields = [ ' views ' ] ) #ZNY 只更新浏览量字段
def comment_list ( self ) : #ZNY 获取评论列表方法
cache_key = ' article_comments_ {id} ' . format ( id = self . id ) #ZNY 生成评论缓存键
value = cache . get ( cache_key ) #ZNY 尝试从缓存获取评论
if value : #ZNY 如果缓存存在
logger . info ( ' get article comments: {id} ' . format ( id = self . id ) ) #ZNY 记录获取缓存日志
return value #ZNY 返回缓存评论
else : #ZNY 如果缓存不存在
comments = self . comment_set . filter ( is_enable = True ) . order_by ( ' -id ' ) #ZNY 从数据库获取启用的评论
cache . set ( cache_key , comments , 60 * 100 ) #ZNY 设置缓存, 有效期100分钟
logger . info ( ' set article comments: {id} ' . format ( id = self . id ) ) #ZNY 记录设置缓存日志
return comments #ZNY 返回评论列表
def get_admin_url ( self ) : #ZNY 获取管理后台URL方法
info = ( self . _meta . app_label , self . _meta . model_name ) #ZNY 获取应用和模型名称
return reverse ( ' admin: %s _ %s _change ' % info , args = ( self . pk , ) ) #ZNY 生成管理后台编辑URL
@cache_decorator ( expiration = 60 * 100 ) #ZNY 缓存装饰器, 缓存100分钟
def next_article ( self ) : #ZNY 获取下一篇文章方法
# 下一篇
return Article . objects . filter (
id__gt = self . id , status = ' p ' ) . order_by ( ' id ' ) . first ( )
return Article . objects . filter ( #ZNY 查询ID大于当前文章且已发布的文章
id__gt = self . id , status = ' p ' ) . order_by ( ' id ' ) . first ( ) #ZNY 按ID升序取第一篇
@cache_decorator ( expiration = 60 * 100 )
def prev_article ( self ) :
@cache_decorator ( expiration = 60 * 100 ) #ZNY 缓存装饰器, 缓存100分钟
def prev_article ( self ) : #ZNY 获取上一篇文章方法
# 前一篇
return Article . objects . filter ( id__lt = self . id , status = ' p ' ) . first ( )
return Article . objects . filter ( id__lt = self . id , status = ' p ' ) . first ( ) #ZNY 查询ID小于当前文章且已发布的文章
def get_first_image_url ( self ) :
def get_first_image_url ( self ) : #ZNY 获取文章首张图片URL方法
"""
Get the first image url from article . body .
: return :
"""
match = re . search ( r ' ! \ [.*? \ ] \ ((.+?) \ ) ' , self . body )
if match :
return match . group ( 1 )
return " "
match = re . search ( r ' ! \ [.*? \ ] \ ((.+?) \ ) ' , self . body ) #ZNY 使用正则匹配Markdown图片语法
if match : #ZNY 如果匹配到图片
return match . group ( 1 ) #ZNY 返回图片URL
return " " #ZNY 没有图片返回空字符串
class Category ( BaseModel ) :
""" 文章分类 """
name = models . CharField ( _ ( ' category name ' ) , max_length = 30 , unique = True )
parent_category = models . ForeignKey (
class Category ( BaseModel ) : #ZNY 定义分类模型,继承基础模型
""" 文章分类 """ #ZNY 分类模型文档字符串
name = models . CharField ( _ ( ' category name ' ) , max_length = 30 , unique = True ) #ZNY 分类名称,唯一
parent_category = models . ForeignKey ( #ZNY 父级分类自关联字段
' self ' ,
verbose_name = _ ( ' parent category ' ) ,
blank = True ,
null = True ,
on_delete = models . CASCADE )
slug = models . SlugField ( default = ' no-slug ' , max_length = 60 , blank = True )
index = models . IntegerField ( default = 0 , verbose_name = _ ( ' index ' ) )
on_delete = models . CASCADE ) #ZNY 支持多级分类
slug = models . SlugField ( default = ' no-slug ' , max_length = 60 , blank = True ) #ZNY URL友好的分类名
index = models . IntegerField ( default = 0 , verbose_name = _ ( ' index ' ) ) #ZNY 排序索引,越大越靠前
class Meta :
ordering = [ ' -index ' ]
verbose_name = _ ( ' category ' )
verbose_name_plural = verbose_name
ordering = [ ' -index ' ] #ZNY 按索引降序排列
verbose_name = _ ( ' category ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
def get_absolute_url ( self ) :
return reverse (
def get_absolute_url ( self ) : #ZNY 实现获取绝对URL方法
return reverse ( #ZNY 生成分类详情页URL
' blog:category_detail ' , kwargs = {
' category_name ' : self . slug } )
def __str__ ( self ) :
return self . name
def __str__ ( self ) : #ZNY 字符串表示方法
return self . name #ZNY 返回分类名称
@cache_decorator ( 60 * 60 * 10 )
def get_category_tree ( self ) :
@cache_decorator ( 60 * 60 * 10 ) #ZNY 缓存装饰器, 缓存10小时
def get_category_tree ( self ) : #ZNY 获取分类树方法
"""
递归获得分类目录的父级
: return :
"""
categorys = [ ]
categorys = [ ] #ZNY 初始化分类列表
def parse ( category ) :
categorys . append ( category )
if category . parent_category :
parse ( category . parent_category )
def parse ( category ) : #ZNY 递归解析函数
categorys . append ( category ) #ZNY 添加当前分类到列表
if category . parent_category : #ZNY 如果存在父级分类
parse ( category . parent_category ) #ZNY 递归解析父级分类
parse ( self )
return categorys
parse ( self ) #ZNY 从当前分类开始解析
return categorys #ZNY 返回分类树列表
@cache_decorator ( 60 * 60 * 10 )
def get_sub_categorys ( self ) :
@cache_decorator ( 60 * 60 * 10 ) #ZNY 缓存装饰器, 缓存10小时
def get_sub_categorys ( self ) : #ZNY 获取所有子分类方法
"""
获得当前分类目录所有子集
: return :
"""
categorys = [ ]
all_categorys = Category . objects . all ( )
categorys = [ ] #ZNY 初始化子分类列表
all_categorys = Category . objects . all ( ) #ZNY 获取所有分类
def parse ( category ) :
if category not in categorys :
categorys . append ( category )
childs = all_categorys . filter ( parent_category = category )
for child in childs :
if category not in categorys :
categorys . append ( child )
parse ( child )
def parse ( category ) : #ZNY 递归解析函数
if category not in categorys : #ZNY 如果分类不在列表中
categorys . append ( category ) #ZNY 添加当前分类
childs = all_categorys . filter ( parent_category = category ) #ZNY 获取直接子分类
for child in childs : #ZNY 遍历子分类
if category not in categorys : #ZNY 如果子分类不在列表中
categorys . append ( child ) #ZNY 添加子分类
parse ( child ) #ZNY 递归解析子分类的子分类
parse ( self )
return categorys
parse ( self ) #ZNY 从当前分类开始解析
return categorys #ZNY 返回所有子分类列表
class Tag ( BaseModel ) :
""" 文章标签 """
name = models . CharField ( _ ( ' tag name ' ) , max_length = 30 , unique = True )
slug = models . SlugField ( default = ' no-slug ' , max_length = 60 , blank = True )
class Tag ( BaseModel ) : #ZNY 定义标签模型,继承基础模型
""" 文章标签 """ #ZNY 标签模型文档字符串
name = models . CharField ( _ ( ' tag name ' ) , max_length = 30 , unique = True ) #ZNY 标签名称,唯一
slug = models . SlugField ( default = ' no-slug ' , max_length = 60 , blank = True ) #ZNY URL友好的标签名
def __str__ ( self ) :
return self . name
def __str__ ( self ) : #ZNY 字符串表示方法
return self . name #ZNY 返回标签名称
def get_absolute_url ( self ) :
return reverse ( ' blog:tag_detail ' , kwargs = { ' tag_name ' : self . slug } )
def get_absolute_url ( self ) : #ZNY 实现获取绝对URL方法
return reverse ( ' blog:tag_detail ' , kwargs = { ' tag_name ' : self . slug } ) #ZNY 生成标签详情页URL
@cache_decorator ( 60 * 60 * 10 )
def get_article_count ( self ) :
return Article . objects . filter ( tags__name = self . name ) . distinct ( ) . count ( )
@cache_decorator ( 60 * 60 * 10 ) #ZNY 缓存装饰器, 缓存10小时
def get_article_count ( self ) : #ZNY 获取标签下文章数量方法
return Article . objects . filter ( tags__name = self . name ) . distinct ( ) . count ( ) #ZNY 统计使用该标签的文章数量
class Meta :
ordering = [ ' name ' ]
verbose_name = _ ( ' tag ' )
verbose_name_plural = verbose_name
ordering = [ ' name ' ] #ZNY 按名称升序排列
verbose_name = _ ( ' tag ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
class Links ( models . Model ) :
""" 友情链接 """
class Links ( models . Model ) : #ZNY 定义友情链接模型
""" 友情链接 """ #ZNY 友情链接模型文档字符串
name = models . CharField ( _ ( ' link name ' ) , max_length = 30 , unique = True )
link = models . URLField ( _ ( ' link ' ) )
sequence = models . IntegerField ( _ ( ' order ' ) , unique = True )
is_enable = models . BooleanField (
_ ( ' is show ' ) , default = True , blank = False , null = False )
show_type = models . CharField (
name = models . CharField ( _ ( ' link name ' ) , max_length = 30 , unique = True ) #ZNY 链接名称,唯一
link = models . URLField ( _ ( ' link ' ) ) #ZNY 链接地址
sequence = models . IntegerField ( _ ( ' order ' ) , unique = True ) #ZNY 排序序号,唯一
is_enable = models . BooleanField ( #ZNY 是否启用显示字段
_ ( ' is show ' ) , default = True , blank = False , null = False ) #ZNY 默认启用
show_type = models . CharField ( #ZNY 显示类型字段
_ ( ' show type ' ) ,
max_length = 1 ,
choices = LinkShowType . choices ,
default = LinkShowType . I )
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now )
last_mod_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now )
default = LinkShowType . I ) #ZNY 默认在首页显示
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now ) #ZNY 创建时间
last_mod_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now ) #ZNY 最后修改时间
class Meta :
ordering = [ ' sequence ' ]
verbose_name = _ ( ' link ' )
verbose_name_plural = verbose_name
ordering = [ ' sequence ' ] #ZNY 按排序序号升序排列
verbose_name = _ ( ' link ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
def __str__ ( self ) :
return self . name
def __str__ ( self ) : #ZNY 字符串表示方法
return self . name #ZNY 返回链接名称
class SideBar ( models . Model ) :
""" 侧边栏,可以展示一些html内容 """
name = models . CharField ( _ ( ' title ' ) , max_length = 100 )
content = models . TextField ( _ ( ' content ' ) )
sequence = models . IntegerField ( _ ( ' order ' ) , unique = True )
is_enable = models . BooleanField ( _ ( ' is enable ' ) , default = True )
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now )
last_mod_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now )
class SideBar ( models . Model ) : #ZNY 定义侧边栏模型
""" 侧边栏,可以展示一些html内容 """ #ZNY 侧边栏模型文档字符串
name = models . CharField ( _ ( ' title ' ) , max_length = 100 ) #ZNY 侧边栏标题
content = models . TextField ( _ ( ' content ' ) ) #ZNY 侧边栏内容
sequence = models . IntegerField ( _ ( ' order ' ) , unique = True ) #ZNY 排序序号,唯一
is_enable = models . BooleanField ( _ ( ' is enable ' ) , default = True ) #ZNY 是否启用,默认启用
creation_time = models . DateTimeField ( _ ( ' creation time ' ) , default = now ) #ZNY 创建时间
last_mod_time = models . DateTimeField ( _ ( ' modify time ' ) , default = now ) #ZNY 最后修改时间
class Meta :
ordering = [ ' sequence ' ]
verbose_name = _ ( ' sidebar ' )
verbose_name_plural = verbose_name
ordering = [ ' sequence ' ] #ZNY 按排序序号升序排列
verbose_name = _ ( ' sidebar ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
def __str__ ( self ) :
return self . name
def __str__ ( self ) : #ZNY 字符串表示方法
return self . name #ZNY 返回侧边栏名称
class BlogSettings ( models . Model ) :
""" blog的配置 """
site_name = models . CharField (
class BlogSettings ( models . Model ) : #ZNY 定义博客设置模型
""" blog的配置 """ #ZNY 博客设置模型文档字符串
site_name = models . CharField ( #ZNY 网站名称字段
_ ( ' site name ' ) ,
max_length = 200 ,
null = False ,
blank = False ,
default = ' ' )
site_description = models . TextField (
site_description = models . TextField ( #ZNY 网站描述字段
_ ( ' site description ' ) ,
max_length = 1000 ,
null = False ,
blank = False ,
default = ' ' )
site_seo_description = models . TextField (
site_seo_description = models . TextField ( #ZNY 网站SEO描述字段
_ ( ' site seo description ' ) , max_length = 1000 , null = False , blank = False , default = ' ' )
site_keywords = models . TextField (
site_keywords = models . TextField ( #ZNY 网站关键词字段
_ ( ' site keywords ' ) ,
max_length = 1000 ,
null = False ,
blank = False ,
default = ' ' )
article_sub_length = models . IntegerField ( _ ( ' article sub length ' ) , default = 300 )
sidebar_article_count = models . IntegerField ( _ ( ' sidebar article count ' ) , default = 10 )
sidebar_comment_count = models . IntegerField ( _ ( ' sidebar comment count ' ) , default = 5 )
article_comment_count = models . IntegerField ( _ ( ' article comment count ' ) , default = 5 )
show_google_adsense = models . BooleanField ( _ ( ' show adsense ' ) , default = False )
google_adsense_codes = models . TextField (
article_sub_length = models . IntegerField ( _ ( ' article sub length ' ) , default = 300 ) #ZNY 文章摘要长度
sidebar_article_count = models . IntegerField ( _ ( ' sidebar article count ' ) , default = 10 ) #ZNY 侧边栏文章数量
sidebar_comment_count = models . IntegerField ( _ ( ' sidebar comment count ' ) , default = 5 ) #ZNY 侧边栏评论数量
article_comment_count = models . IntegerField ( _ ( ' article comment count ' ) , default = 5 ) #ZNY 文章页评论数量
show_google_adsense = models . BooleanField ( _ ( ' show adsense ' ) , default = False ) #ZNY 是否显示谷歌广告
google_adsense_codes = models . TextField ( #ZNY 谷歌广告代码字段
_ ( ' adsense code ' ) , max_length = 2000 , null = True , blank = True , default = ' ' )
open_site_comment = models . BooleanField ( _ ( ' open site comment ' ) , default = True )
global_header = models . TextField ( " 公共头部 " , null = True , blank = True , default = ' ' )
global_footer = models . TextField ( " 公共尾部 " , null = True , blank = True , default = ' ' )
beian_code = models . CharField (
open_site_comment = models . BooleanField ( _ ( ' open site comment ' ) , default = True ) #ZNY 是否开启全站评论
global_header = models . TextField ( " 公共头部 " , null = True , blank = True , default = ' ' ) #ZNY 全局头部内容
global_footer = models . TextField ( " 公共尾部 " , null = True , blank = True , default = ' ' ) #ZNY 全局尾部内容
beian_code = models . CharField ( #ZNY ICP备案号字段
' 备案号 ' ,
max_length = 2000 ,
null = True ,
blank = True ,
default = ' ' )
analytics_code = models . TextField (
analytics_code = models . TextField ( #ZNY 网站统计代码字段
" 网站统计代码 " ,
max_length = 1000 ,
null = False ,
blank = False ,
default = ' ' )
show_gongan_code = models . BooleanField (
show_gongan_code = models . BooleanField ( #ZNY 是否显示公安备案号字段
' 是否显示公安备案号 ' , default = False , null = False )
gongan_beiancode = models . TextField (
gongan_beiancode = models . TextField ( #ZNY 公安备案号字段
' 公安备案号 ' ,
max_length = 2000 ,
null = True ,
blank = True ,
default = ' ' )
comment_need_review = models . BooleanField (
comment_need_review = models . BooleanField ( #ZNY 评论是否需要审核字段
' 评论是否需要审核 ' , default = False , null = False )
class Meta :
verbose_name = _ ( ' Website configuration ' )
verbose_name_plural = verbose_name
verbose_name = _ ( ' Website configuration ' ) #ZNY 单数显示名称
verbose_name_plural = verbose_name #ZNY 复数显示名称
def __str__ ( self ) :
return self . site_name
def __str__ ( self ) : #ZNY 字符串表示方法
return self . site_name #ZNY 返回网站名称
def clean ( self ) :
if BlogSettings . objects . exclude ( id = self . id ) . count ( ) :
raise ValidationError ( _ ( ' There can only be one configuration ' ) )
def clean ( self ) : #ZNY 数据清洗验证方法
if BlogSettings . objects . exclude ( id = self . id ) . count ( ) : #ZNY 检查是否已存在其他配置
raise ValidationError ( _ ( ' There can only be one configuration ' ) ) #ZNY 只能有一个配置,抛出验证错误
def save ( self , * args , * * kwargs ) :
super ( ) . save ( * args , * * kwargs )
from djangoblog . utils import cache
cache . clear ( )
def save ( self , * args , * * kwargs ) : #ZNY 重写保存方法
super ( ) . save ( * args , * * kwargs ) #ZNY 调用父类保存方法
from djangoblog . utils import cache #ZNY 导入缓存工具
cache . clear ( ) #ZNY 保存配置后清除所有缓存