github链接 https://github.com/yt-xy/Django-blog
编写Admin管理后台
Category和Tag的Admin管理后台
blogs/admin.py
from django.contrib import admin
from .models import Post, Category, Tag
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'status', 'is_nav', 'created_time')
fields = ('name', 'status', 'is_nav')
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display = ('name', 'status', 'created_time')
fields = ('name', 'status')
为使owner这个字段自动设定为当前的登录用户
class CategoryAdmin(admin.ModelAdmin):
...
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(CategoryAdmin, self).save_model(request, obj, form, change)
class TagAdmin(admin.ModelAdmin):
...
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(TagAdmin, self).save_model(request, obj, form, change)
# request是当前请求,request.user是当前已经登录的用户。如果是未登录的情况下,拿到的就是匿名用户
# obj是当前要保存的对象,form是页面提交表单之后的对象,嫦娥用于标志本次保存的数据是新增还是更新
Post的Admin管理后台
blogs/admin.py
from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
from .models import Post, Category, Tag
...
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = [
'title', 'category', 'status',
'created_time', 'operator'
]
list_display_links = []
list_filter = ['category', ]
search_fields = ['title', 'category__name']
actions_on_top = True
actions_on_bottom = True
# 编辑页面
save_on_top = True
fields = (
('category', 'title'),
'desc',
'status',
'content',
'tag',
)
def operator(self, obj):
return format_html(
'<a href="{}">编辑<a/>',
reverse('admin:blogs_post_change', args=(obj.id,))
)
operator.short_description = '操作'
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(PostAdmin, self).save_model(request, obj, form, change)
list_display:用来配置列表页面展示哪些字段
list_display_links:用来配置哪些字段可以作为链接,点击它们,可以进入编辑页面
list_filter:配置页面过滤器,需要通过哪些字段来过滤列表页
search_fields:配置搜索字段
actions_on_top:动作相关的配置,是否展示在顶部
action_on_bottom:动作相关的配置,是否展示在底部
save_on_top:保存、编辑、编辑并新建按钮是否在顶部展示
自定义函数
在日常开发中,自定义函数很常用,除了可以自定义HTML代码外,还可以定义需要展示的其他内容。
# 比如在“分类”列表页,需要展示该分类下有多少篇文章
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'status', 'is_nav', 'created_time', 'post_count')
fields = ('name', 'status', 'is_nav')
def post_count(self, obj):
return obj.post_set.count()
post_count.short_description = '文章数量'
运行时会在页面上看见-Category object,这是因为没有配置__str__
方法,对于每个Model都应该配置。
class Category(models.Model):
...
def __str__(self):
return self.name
Comment的Admin管理后台
comment/admin.py
from django.contrib import admin
from .models import Comment
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ('target', 'nickname', 'content', 'website', 'created_time')
Config的Admin管理后台
config/admin.py
from django.contrib import admin
from .models import Link, SideBar
@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
list_display = ('title', 'href', 'status', 'weight', 'created_time')
fields = ('title', 'href', 'status', 'weight')
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(LinkAdmin, self).save_model(request, obj, form, change)
@admin.register(SideBar)
class SideBarAdmin(admin.ModelAdmin):
list_display = ('title', 'display_type', 'content', 'created_time')
fields = ('title', 'display_type', 'content')
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(SideBarAdmin, self).save_model(request, obj, form, change)