|
|
#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'<a href="%s">%s</a>' % (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) |