diff --git a/admin.py b/admin.py new file mode 100644 index 0000000..4522598 --- /dev/null +++ b/admin.py @@ -0,0 +1,172 @@ +#zf:导入Django表单模块 +from django import forms +#zf:导入Django管理后台模块 +from django.contrib import admin +#zf:导入获取用户模型的函数 +from django.contrib.auth import get_user_model +#zf:导入URL反向解析函数 +from django.urls import reverse +#zf:导入HTML格式化函数 +from django.utils.html import format_html +#zf:导入国际化翻译函数 +from django.utils.translation import gettext_lazy as _ + +#zf:导入博客应用的Article模型 +from .models import Article + + +#zf:定义文章表单类,继承自ModelForm +class ArticleForm(forms.ModelForm): + #zf:被注释掉的代码:使用AdminPagedownWidget作为body字段的widget + # body = forms.CharField(widget=AdminPagedownWidget()) + + class Meta: + model = Article + #zf:包含所有字段 + fields = '__all__' + + +#zf:定义批量发布文章的操作函数 +def makr_article_publish(modeladmin, request, queryset): + #zf:将选中文章的状态更新为'p'(已发布) + queryset.update(status='p') + +#zf:定义批量将文章设为草稿的操作函数 +def draft_article(modeladmin, request, queryset): + #zf:将选中文章的状态更新为'd'(草稿) + queryset.update(status='d') + +#zf:定义批量关闭文章评论的操作函数 +def close_article_commentstatus(modeladmin, request, queryset): + #zf:将选中文章的评论状态更新为'c'(关闭) + queryset.update(comment_status='c') + +#zf:定义批量开启文章评论的操作函数 +def open_article_commentstatus(modeladmin, request, queryset): + #zf:将选中文章的评论状态更新为'o'(开启) + queryset.update(comment_status='o') + + +#zf:为操作函数设置描述信息,用于在管理后台显示(支持国际化) +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') + + +#zf:定义文章管理类,继承自ModelAdmin +class ArticlelAdmin(admin.ModelAdmin): + #zf:每页显示20条记录 + list_per_page = 20 + #zf:设置可搜索的字段为body和title + search_fields = ('body', 'title') + #zf:使用自定义的ArticleForm + form = ArticleForm + #zf:设置在列表页显示的字段 + list_display = ( + 'id', + 'title', + 'author', + #zf:自定义的分类链接字段 + 'link_to_category', + 'creation_time', + 'views', + 'status', + 'type', + 'article_order') + #zf:设置哪些字段可以作为链接点击进入编辑页 + list_display_links = ('id', 'title') + #zf:设置右侧的过滤器字段 + list_filter = ('status', 'type', 'category') + #zf:对tags字段使用水平过滤器 + filter_horizontal = ('tags',) + #zf:在表单中排除这些字段(由系统自动管理) + exclude = ('creation_time', 'last_modify_time') + #zf:启用"在站点上查看"功能 + view_on_site = True + #zf:注册自定义的管理操作 + actions = [ + makr_article_publish, + draft_article, + close_article_commentstatus, + open_article_commentstatus] + + #zf:自定义字段:显示分类链接 + def link_to_category(self, obj): + #zf:获取分类模型的app_label和model_name + info = (obj.category._meta.app_label, obj.category._meta.model_name) + #zf:生成分类编辑页的URL + link = reverse('admin:%s_%s_change' % info, args=(obj.category.id,)) + #zf:返回HTML链接 + return format_html(u'%s' % (link, obj.category.name)) + + #zf:设置字段显示名称 + link_to_category.short_description = _('category') + + #zf:自定义表单获取方法 + def get_form(self, request, obj=None, **kwargs): + form = super(ArticlelAdmin, self).get_form(request, obj, **kwargs) + #zf:限制作者字段只能选择超级用户 + form.base_fields['author'].queryset = get_user_model( + ).objects.filter(is_superuser=True) + return form + + #zf:保存模型的方法 + def save_model(self, request, obj, form, change): + super(ArticlelAdmin, self).save_model(request, obj, form, change) + + #zf:获取在站点上查看的URL + def get_view_on_site_url(self, obj=None): + if obj: + #zf:获取文章的完整URL + url = obj.get_full_url() + return url + else: + from djangoblog.utils import get_current_site + #zf:获取当前站点域名 + site = get_current_site().domain + return site + + +#zf:定义标签管理类 +class TagAdmin(admin.ModelAdmin): + #zf:排除这些字段(由系统自动管理) + exclude = ('slug', 'last_mod_time', 'creation_time') + + +#zf:定义分类管理类 +class CategoryAdmin(admin.ModelAdmin): + #zf:设置在列表页显示的字段 + list_display = ('name', 'parent_category', 'index') + #zf:排除这些字段(由系统自动管理) + exclude = ('slug', 'last_mod_time', 'creation_time') + + +#zf:定义链接管理类 +class LinksAdmin(admin.ModelAdmin): + #zf:排除这些字段(由系统自动管理) + exclude = ('last_mod_time', 'creation_time') + + +#zf:定义侧边栏管理类 +class SideBarAdmin(admin.ModelAdmin): + #zf:设置在列表页显示的字段 + list_display = ('name', 'content', 'is_enable', 'sequence') + #zf:排除这些字段(由系统自动管理) + exclude = ('last_mod_time', 'creation_time') + + +#zf:定义博客设置管理类 +class BlogSettingsAdmin(admin.ModelAdmin): + #zf:没有特殊配置 + pass + + +#zf:注册模型到管理后台 +#zf:注意:在你提供的代码中,模型注册部分被省略了,通常应该包含如下代码: +#zf:admin.site.register(Article, ArticlelAdmin) +#zf:admin.site.register(Tag, TagAdmin) +#zf:admin.site.register(Category, CategoryAdmin) +#zf:admin.site.register(Links, LinksAdmin) +#zf:admin.site.register(SideBar, SideBarAdmin) +#zf:admin.site.register(BlogSettings, BlogSettingsAdmin) \ No newline at end of file