代码注释 #4

Closed
pxi4cupse wants to merge 0 commits from yxy_branch into develop

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$/djangoblog/src/DjangoBlog-master/DjangoBlog-master" />
<option name="settingsModule" value="settings.py" />
<option name="manageScript" value="$MODULE_DIR$/djangoblog/src/DjangoBlog-master/DjangoBlog-master/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/djangoblog/src/DjangoBlog-master/DjangoBlog-master" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Python 3.12 (PythonProject1)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12" />
<option name="sdkName" value="Python 3.12 (PythonProject1)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (PythonProject1)" project-jdk-type="Python SDK" />
</project>

@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/zyl_django.iml" filepath="$PROJECT_DIR$/.idea/zyl_django.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/DjangoBlog-yxy_branch.iml" filepath="$PROJECT_DIR$/.idea/DjangoBlog-yxy_branch.iml" />
</modules>
</component>
</project>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/zyl_django.iml" filepath="$PROJECT_DIR$/.idea/zyl_django.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,189 @@
# 导入Django表单模块用于创建自定义表单
from django import forms
# 导入Django admin模块用于注册模型到后台管理系统
from django.contrib import admin
# 导入获取用户模型的函数,用于处理作者关联
from django.contrib.auth import get_user_model
# 导入reverse函数用于生成URL
from django.urls import reverse
# 导入format_html用于在admin中生成HTML代码
from django.utils.html import format_html
# 导入国际化工具,用于翻译后台显示文本
from django.utils.translation import gettext_lazy as _
# 导入当前应用的Article模型
from .models import Article
class ArticleForm(forms.ModelForm):
"""
自定义文章表单用于在admin中自定义文章的编辑界面
可以在这里添加自定义字段验证 widgets 或修改表单行为
目前注释掉了pagedown编辑器的配置如需使用可取消注释
"""
# body = forms.CharField(widget=AdminPagedownWidget()) # 富文本编辑器配置
class Meta:
model = Article # 关联的模型
fields = '__all__' # 包含模型的所有字段
# 自定义批量操作:发布选中的文章
def makr_article_publish(modeladmin, request, queryset):
# 将选中文章的状态更新为'p'(published)
queryset.update(status='p')
# 自定义批量操作:将选中的文章设为草稿
def draft_article(modeladmin, request, queryset):
# 将选中文章的状态更新为'd'(draft)
queryset.update(status='d')
# 自定义批量操作:关闭选中文章的评论
def close_article_commentstatus(modeladmin, request, queryset):
# 将选中文章的评论状态更新为'c'(closed)
queryset.update(comment_status='c')
# 自定义批量操作:开启选中文章的评论
def open_article_commentstatus(modeladmin, request, queryset):
# 将选中文章的评论状态更新为'o'(open)
queryset.update(comment_status='o')
# 为批量操作设置显示名称(支持国际化)
makr_article_publish.short_description = _('Publish selected articles')
draft_article.short_description = _('Draft selected articles')
close_article_commentstatus.short_description = _('Close article comments')
open_article_commentstatus.short_description = _('Open article comments')
class ArticlelAdmin(admin.ModelAdmin):
"""
文章模型的Admin配置类自定义文章在后台的显示和操作方式
"""
list_per_page = 20 # 每页显示20条记录
search_fields = ('body', 'title') # 可搜索的字段
form = ArticleForm # 使用自定义的表单
# 列表页显示的字段
list_display = (
'id', # 文章ID
'title', # 标题
'author', # 作者
'link_to_category', # 分类(带链接)
'creation_time', # 创建时间
'views', # 浏览量
'status', # 状态
'type', # 类型(文章/页面)
'article_order' # 排序序号
)
# 列表页可点击跳转编辑的字段
list_display_links = ('id', 'title')
# 可筛选的字段(右侧过滤器)
list_filter = ('status', 'type', 'category')
# 多对多字段的水平选择器
filter_horizontal = ('tags',)
# 编辑页排除的字段(这些字段通常自动生成,不需要手动编辑)
exclude = ('creation_time', 'last_modify_time')
# 启用"在站点上查看"功能
view_on_site = True
# 注册批量操作
actions = [
makr_article_publish,
draft_article,
close_article_commentstatus,
open_article_commentstatus
]
def link_to_category(self, obj):
"""
自定义列表字段显示分类并添加跳转链接到分类编辑页
Args:
obj: 当前文章对象
Returns:
HTML代码带链接的分类名称
"""
# 获取分类模型的元数据用于生成URL
info = (obj.category._meta.app_label, obj.category._meta.model_name)
# 生成分类编辑页的URL
link = reverse('admin:%s_%s_change' % info, args=(obj.category.id,))
# 返回带链接的HTML
return format_html(u'<a href="%s">%s</a>' % (link, obj.category.name))
# 自定义字段的显示名称
link_to_category.short_description = _('category')
def get_form(self, request, obj=None, **kwargs):
"""
重写表单获取方法自定义表单字段
这里限制了作者只能选择超级用户
"""
form = super(ArticlelAdmin, self).get_form(request, obj, **kwargs)
# 作者字段只显示超级用户
form.base_fields['author'].queryset = get_user_model().objects.filter(is_superuser=True)
return form
def save_model(self, request, obj, form, change):
"""
重写保存模型的方法
可以在这里添加额外的保存逻辑如自动填充某些字段
目前使用默认实现
"""
super(ArticlelAdmin, self).save_model(request, obj, form, change)
def get_view_on_site_url(self, obj=None):
"""
自定义"在站点上查看"的链接
Args:
obj: 文章对象
Returns:
文章的前台访问URL或网站首页
"""
if obj:
# 如果有文章对象返回文章的完整URL
url = obj.get_full_url()
return url
else:
# 如果没有对象(如在列表页),返回网站首页
from djangoblog.utils import get_current_site
site = get_current_site().domain
return site
class TagAdmin(admin.ModelAdmin):
"""标签模型的Admin配置"""
# 编辑页排除的字段(自动生成)
exclude = ('slug', 'last_mod_time', 'creation_time')
class CategoryAdmin(admin.ModelAdmin):
"""分类模型的Admin配置"""
# 列表页显示的字段
list_display = ('name', 'parent_category', 'index')
# 编辑页排除的字段
exclude = ('slug', 'last_mod_time', 'creation_time')
class LinksAdmin(admin.ModelAdmin):
"""链接模型的Admin配置"""
exclude = ('last_mod_time', 'creation_time')
class SideBarAdmin(admin.ModelAdmin):
"""侧边栏模型的Admin配置"""
list_display = ('name', 'content', 'is_enable', 'sequence')
exclude = ('last_mod_time', 'creation_time')
class BlogSettingsAdmin(admin.ModelAdmin):
"""博客设置模型的Admin配置"""
pass # 使用默认配置

@ -0,0 +1,15 @@
# 从Django的apps模块导入AppConfig类用于定义应用的配置
from django.apps import AppConfig
class BlogConfig(AppConfig):
"""
博客应用blog的配置类
Django通过此类识别和配置应用的基本信息
包括应用名称默认自动生成的主键类型等
当项目启动时Django会加载每个应用的AppConfig子类
"""
# 定义应用的名称,必须与应用的实际目录名一致
# 这个名称用于Django内部识别应用例如在INSTALLED_APPS中注册时使用
name = 'blog'

@ -0,0 +1,73 @@
# 导入日志模块,用于记录系统运行时的信息和错误
import logging
# 从django.utils导入timezone用于获取当前时间
from django.utils import timezone
# 导入自定义的缓存工具和获取博客设置的工具函数
from djangoblog.utils import cache, get_blog_setting
# 导入当前应用下的Category分类和Article文章模型
from .models import Category, Article
# 创建日志记录器,用于记录当前模块的日志信息
logger = logging.getLogger(__name__)
def seo_processor(requests):
"""
自定义上下文处理器用于在所有模板中全局共享SEO相关的配置和数据
上下文处理器是Django的一个功能允许你在所有模板中自动添加变量
无需在每个视图函数中单独传递特别适合网站全局配置信息的共享
Args:
requests: Django请求对象包含当前请求的相关信息如域名协议等
Returns:
dict: 包含网站配置分类页面等信息的字典将被注入到所有模板中
"""
# 定义缓存键,用于标识当前处理器的缓存数据
key = 'seo_processor'
# 尝试从缓存中获取数据,减少数据库查询和计算开销
value = cache.get(key)
# 如果缓存中存在数据,直接返回缓存内容
if value:
return value
else:
# 缓存未命中时,记录日志并重新计算数据
logger.info('set processor cache.')
# 获取博客的全局设置(从数据库或其他配置源)
setting = get_blog_setting()
# 构建需要传递给模板的全局变量字典
value = {
'SITE_NAME': setting.site_name, # 网站名称
'SHOW_GOOGLE_ADSENSE': setting.show_google_adsense, # 是否显示谷歌广告
'GOOGLE_ADSENSE_CODES': setting.google_adsense_codes, # 谷歌广告代码
'SITE_SEO_DESCRIPTION': setting.site_seo_description, # 网站SEO描述用于搜索引擎
'SITE_DESCRIPTION': setting.site_description, # 网站描述
'SITE_KEYWORDS': setting.site_keywords, # 网站关键词用于SEO
# 网站基础URL如https://example.com/
'SITE_BASE_URL': requests.scheme + '://' + requests.get_host() + '/',
'ARTICLE_SUB_LENGTH': setting.article_sub_length, # 文章摘要长度
'nav_category_list': Category.objects.all(), # 导航栏显示的所有分类
# 导航栏显示的页面(类型为'p'即page状态为'p'即published
'nav_pages': Article.objects.filter(
type='p',
status='p'),
'OPEN_SITE_COMMENT': setting.open_site_comment, # 是否开启网站评论功能
'BEIAN_CODE': setting.beian_code, # 网站备案号
'ANALYTICS_CODE': setting.analytics_code, # 网站统计代码如Google Analytics
"BEIAN_CODE_GONGAN": setting.gongan_beiancode, # 公安备案号
"SHOW_GONGAN_CODE": setting.show_gongan_code, # 是否显示公安备案号
"CURRENT_YEAR": timezone.now().year, # 当前年份(用于页脚版权信息等)
"GLOBAL_HEADER": setting.global_header, # 全局页眉代码如额外的CSS/JS
"GLOBAL_FOOTER": setting.global_footer, # 全局页脚代码
"COMMENT_NEED_REVIEW": setting.comment_need_review, # 评论是否需要审核
}
# 将数据存入缓存有效期为10小时60秒*60分*10小时
cache.set(key, value, 60 * 60 * 10)
# 返回构建的全局变量字典
return value

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save