|
|
# bjy: 从Django中导入所需的模块和类
|
|
|
from django import forms
|
|
|
from django.contrib import admin
|
|
|
from django.contrib.auth import get_user_model
|
|
|
from django.urls import reverse
|
|
|
from django.utils.html import format_html
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
# Register your models here.
|
|
|
from .models import Article, Category, Tag, Links, SideBar, BlogSettings
|
|
|
|
|
|
|
|
|
# bjy: 为Article模型创建一个自定义的ModelForm
|
|
|
class ArticleForm(forms.ModelForm):
|
|
|
# bjy: 示例:如果使用Pagedown编辑器,可以取消下面这行的注释
|
|
|
# body = forms.CharField(widget=AdminPagedownWidget())
|
|
|
|
|
|
class Meta:
|
|
|
# bjy: 指定这个表单对应的模型是Article
|
|
|
model = Article
|
|
|
# bjy: 表示在表单中包含模型的所有字段
|
|
|
fields = '__all__'
|
|
|
|
|
|
|
|
|
# bjy: 定义一个admin动作,用于将选中的文章发布
|
|
|
def makr_article_publish(modeladmin, request, queryset):
|
|
|
# bjy: 批量更新查询集中所有文章的状态为'p'(已发布)
|
|
|
queryset.update(status='p')
|
|
|
|
|
|
|
|
|
# bjy: 定义一个admin动作,用于将选中的文章设为草稿
|
|
|
def draft_article(modeladmin, request, queryset):
|
|
|
# bjy: 批量更新查询集中所有文章的状态为'd'(草稿)
|
|
|
queryset.update(status='d')
|
|
|
|
|
|
|
|
|
# bjy: 定义一个admin动作,用于关闭选中文章的评论功能
|
|
|
def close_article_commentstatus(modeladmin, request, queryset):
|
|
|
# bjy: 批量更新查询集中所有文章的评论状态为'c'(关闭)
|
|
|
queryset.update(comment_status='c')
|
|
|
|
|
|
|
|
|
# bjy: 定义一个admin动作,用于开启选中文章的评论功能
|
|
|
def open_article_commentstatus(modeladmin, request, queryset):
|
|
|
# bjy: 批量更新查询集中所有文章的评论状态为'o'(开启)
|
|
|
queryset.update(comment_status='o')
|
|
|
|
|
|
|
|
|
# bjy: 为admin动作设置在后台显示的描述文本
|
|
|
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')
|
|
|
|
|
|
|
|
|
# bjy: 为Article模型自定义Admin管理界面
|
|
|
class ArticlelAdmin(admin.ModelAdmin):
|
|
|
# bjy: 设置每页显示20条记录
|
|
|
list_per_page = 20
|
|
|
# bjy: 启用搜索功能,搜索范围包括文章内容(body)和标题(title)
|
|
|
search_fields = ('body', 'title')
|
|
|
# bjy: 指定使用的自定义表单
|
|
|
form = ArticleForm
|
|
|
# bjy: 在列表视图中显示的字段
|
|
|
list_display = (
|
|
|
'id',
|
|
|
'title',
|
|
|
'author',
|
|
|
'link_to_category', # bjy: 自定义方法,显示指向分类的链接
|
|
|
'creation_time',
|
|
|
'views',
|
|
|
'status',
|
|
|
'type',
|
|
|
'article_order')
|
|
|
# bjy: 设置列表视图中可点击进入编辑页面的链接字段
|
|
|
list_display_links = ('id', 'title')
|
|
|
# bjy: 启用右侧筛选栏,可按状态、类型、分类进行筛选
|
|
|
list_filter = ('status', 'type', 'category')
|
|
|
# bjy: 启用日期层次导航,按创建时间进行分层
|
|
|
date_hierarchy = 'creation_time'
|
|
|
# bjy: 为多对多字段(tags)提供一个水平筛选的界面
|
|
|
filter_horizontal = ('tags',)
|
|
|
# bjy: 在编辑页面中排除的字段,这些字段将自动处理
|
|
|
exclude = ('creation_time', 'last_modify_time')
|
|
|
# bjy: 在列表页面显示“在站点上查看”的按钮
|
|
|
view_on_site = True
|
|
|
# bjy: 将自定义的admin动作添加到动作下拉列表中
|
|
|
actions = [
|
|
|
makr_article_publish,
|
|
|
draft_article,
|
|
|
close_article_commentstatus,
|
|
|
open_article_commentstatus]
|
|
|
# bjy: 对于外键字段(author, category),显示为一个输入框用于输入ID,而不是下拉列表
|
|
|
raw_id_fields = ('author', 'category',)
|
|
|
|
|
|
# bjy: 自定义方法,用于在列表页面显示一个指向文章分类的链接
|
|
|
def link_to_category(self, obj):
|
|
|
# bjy: 获取分类模型的app_label和model_name,用于构建admin URL
|
|
|
info = (obj.category._meta.app_label, obj.category._meta.model_name)
|
|
|
# bjy: 生成指向该分类编辑页面的URL
|
|
|
link = reverse('admin:%s_%s_change' % info, args=(obj.category.id,))
|
|
|
# bjy: 使用format_html安全地生成HTML链接
|
|
|
return format_html(u'<a href="%s">%s</a>' % (link, obj.category.name))
|
|
|
|
|
|
# bjy: 设置该方法在列表页面列标题的显示文本
|
|
|
link_to_category.short_description = _('category')
|
|
|
|
|
|
# bjy: 重写get_form方法,用于动态修改表单
|
|
|
def get_form(self, request, obj=None, **kwargs):
|
|
|
# bjy: 获取父类的表单
|
|
|
form = super(ArticlelAdmin, self).get_form(request, obj, **kwargs)
|
|
|
# bjy: 修改author字段的查询集,只显示超级用户
|
|
|
form.base_fields['author'].queryset = get_user_model(
|
|
|
).objects.filter(is_superuser=True)
|
|
|
return form
|
|
|
|
|
|
# bjy: 重写save_model方法,在保存模型时执行额外操作
|
|
|
def save_model(self, request, obj, form, change):
|
|
|
# bjy: 调用父类的save_model方法执行默认保存操作
|
|
|
super(ArticlelAdmin, self).save_model(request, obj, form, change)
|
|
|
|
|
|
# bjy: 重写get_view_on_site_url方法,自定义“在站点上查看”的URL
|
|
|
def get_view_on_site_url(self, obj=None):
|
|
|
if obj:
|
|
|
# bjy: 如果对象存在,则调用模型的get_full_url方法获取URL
|
|
|
url = obj.get_full_url()
|
|
|
return url
|
|
|
else:
|
|
|
# bjy: 如果对象不存在(例如在添加新对象时),则返回网站首页URL
|
|
|
from djangoblog.utils import get_current_site
|
|
|
site = get_current_site().domain
|
|
|
return site
|
|
|
|
|
|
|
|
|
# bjy: 为Tag模型自定义Admin管理界面
|
|
|
class TagAdmin(admin.ModelAdmin):
|
|
|
# bjy: 在编辑页面中排除的字段
|
|
|
exclude = ('slug', 'last_mod_time', 'creation_time')
|
|
|
|
|
|
|
|
|
# bjy: 为Category模型自定义Admin管理界面
|
|
|
class CategoryAdmin(admin.ModelAdmin):
|
|
|
# bjy: 在列表视图中显示的字段
|
|
|
list_display = ('name', 'parent_category', 'index')
|
|
|
# bjy: 在编辑页面中排除的字段
|
|
|
exclude = ('slug', 'last_mod_time', 'creation_time')
|
|
|
|
|
|
|
|
|
# bjy: 为Links模型自定义Admin管理界面
|
|
|
class LinksAdmin(admin.ModelAdmin):
|
|
|
# bjy: 在编辑页面中排除的字段
|
|
|
exclude = ('last_mod_time', 'creation_time')
|
|
|
|
|
|
|
|
|
# bjy: 为SideBar模型自定义Admin管理界面
|
|
|
class SideBarAdmin(admin.ModelAdmin):
|
|
|
# bjy: 在列表视图中显示的字段
|
|
|
list_display = ('name', 'content', 'is_enable', 'sequence')
|
|
|
# bjy: 在编辑页面中排除的字段
|
|
|
exclude = ('last_mod_time', 'creation_time')
|
|
|
|
|
|
|
|
|
# bjy: 为BlogSettings模型自定义Admin管理界面
|
|
|
class BlogSettingsAdmin(admin.ModelAdmin):
|
|
|
# bjy: 使用默认配置,无需自定义
|
|
|
pass
|