# 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'%s' % (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