You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tentest/doc/DjangoBlog/blog/admin.py

145 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
class ArticleForm(forms.ModelForm):
# body = forms.CharField(widget=AdminPagedownWidget())
class Meta:
# mk: 指定表单关联的模型和字段
model = Article
fields = '__all__'
def makr_article_publish(modeladmin, request, queryset):
# mk: 批量发布文章操作,将选中的文章状态更新为已发布('p')
queryset.update(status='p')
def draft_article(modeladmin, request, queryset):
# mk: 批量将文章设为草稿状态,将选中的文章状态更新为草稿('d')
queryset.update(status='d')
def close_article_commentstatus(modeladmin, request, queryset):
# mk: 批量关闭文章评论功能,将选中的文章评论状态更新为关闭('c')
queryset.update(comment_status='c')
def open_article_commentstatus(modeladmin, request, queryset):
# mk: 批量开启文章评论功能,将选中的文章评论状态更新为开启('o')
queryset.update(comment_status='o')
# mk: 为自定义管理操作设置显示名称
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):
# mk: 设置文章管理界面每页显示20条记录
list_per_page = 20
# mk: 设置搜索字段,支持在文章正文和标题中搜索
search_fields = ('body', 'title')
# mk: 指定使用的表单类
form = ArticleForm
# mk: 设置在管理界面列表中显示的字段
list_display = (
'id',
'title',
'author',
'link_to_category',
'creation_time',
'views',
'status',
'type',
'article_order')
# mk: 设置可以作为链接点击的字段
list_display_links = ('id', 'title')
# mk: 设置过滤器,可以在右侧边栏按状态、类型、分类筛选
list_filter = ('status', 'type', 'category')
# mk: 设置日期层级结构,用于按日期筛选文章
date_hierarchy = 'creation_time'
# mk: 设置多对多字段的横向筛选器
filter_horizontal = ('tags',)
# mk: 排除某些字段在表单中显示
exclude = ('creation_time', 'last_modify_time')
# mk: 启用"在站点上查看"功能
view_on_site = True
# mk: 注册自定义的批量操作
actions = [
makr_article_publish,
draft_article,
close_article_commentstatus,
open_article_commentstatus]
# mk: 设置使用原始ID字段的外键字段提升性能
raw_id_fields = ('author', 'category',)
def link_to_category(self, obj):
# mk: 创建指向分类编辑页面的链接
info = (obj.category._meta.app_label, obj.category._meta.model_name)
link = reverse('admin:%s_%s_change' % info, args=(obj.category.id,))
return format_html(u'<a href="%s">%s</a>' % (link, obj.category.name))
# mk: 设置分类链接字段的显示名称
link_to_category.short_description = _('category')
def get_form(self, request, obj=None, **kwargs):
# mk: 自定义表单,限制作者字段只能选择超级用户
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):
# mk: 保存模型实例,调用父类的保存方法
super(ArticlelAdmin, self).save_model(request, obj, form, change)
def get_view_on_site_url(self, obj=None):
# mk: 返回在站点上查看文章的URL
if obj:
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):
# mk: 标签管理界面排除某些字段
exclude = ('slug', 'last_mod_time', 'creation_time')
class CategoryAdmin(admin.ModelAdmin):
# mk: 设置分类管理界面显示的字段
list_display = ('name', 'parent_category', 'index')
# mk: 分类管理界面排除某些字段
exclude = ('slug', 'last_mod_time', 'creation_time')
class LinksAdmin(admin.ModelAdmin):
# mk: 链接管理界面排除某些字段
exclude = ('last_mod_time', 'creation_time')
class SideBarAdmin(admin.ModelAdmin):
# mk: 设置侧边栏管理界面显示的字段
list_display = ('name', 'content', 'is_enable', 'sequence')
# mk: 侧边栏管理界面排除某些字段
exclude = ('last_mod_time', 'creation_time')
class BlogSettingsAdmin(admin.ModelAdmin):
# mk: 博客设置管理界面使用默认配置
pass