创建blog的管理后台
在blogApp/admin.py
编写Tag和Category的管理后台
1 from django.contrib import admin 2 3 from blogApp.models import Category, Tag 4 5 6 @admin.register(Category) 7 class CategoryAdmin(admin.ModelAdmin): 8 list_display = ('name', 'status', 'is_nav', 'created_time') 9 fields = ('name', 'status', 'is_nav') 10 11 12 @admin.register(Tag) 13 class TagAdmin(admin.ModelAdmin): 14 list_display = ('name', 'status', 'created_time') 15 fields = ('name', 'status')
来运行一下看看效果.
创建超级用户
python manage.py createsuperuser
按照提示输入信息,之后启动项目进入http://127.0.0.1:8000/admin/
登录之后应该看到如下界面
如果尝试增加一条数据,会出现如下错误:
因为我们的Model中有一个owner字段,但页面上没有填这一项
显而易见,这三个字段正好是
fields = ('name', 'status', 'is_nav')
中的三个,那么是不是把owner加进去就行了呢?
把owner放进去确实可以解决这个问题,但是又会出现另外一个问题,当我们有多个用户的时候,在选择的时候也会出现多个用户!这就比较尴尬了,所以我们换一种做法.
当我们保存数据时,把owner这个字段设置为当前的登录用户,这样就可以避免上面提到的问题.这时就需要重写ModelAdmin的save_model方法.
1 @admin.register(Category) 2 class CategoryAdmin(admin.ModelAdmin): 3 list_display = ('name', 'status', 'is_nav', 'created_time') 4 fields = ('name', 'status', 'is_nav') 5 6 def save_model(self, request, obj, form, change): 7 obj.owner = request.user 8 return super(CategoryAdmin, self).save_model(request, obj, form, change) 9 10 11 @admin.register(Tag) 12 class TagAdmin(admin.ModelAdmin): 13 list_display = ('name', 'status', 'created_time') 14 fields = ('name', 'status') 15 16 def save_model(self, request, obj, form, change): 17 obj.owner = request.user 18 return super(TagAdmin, self).save_model(request, obj, form, change)
request就是当前请求,request.user是当前已登录的用户,如果是未登录的情况下,request.user返回的就是匿名用户.
obj就是当前要保存的对象
form是页面提交的表单之后的对象
change用于标志本次保存的数据是新增的还是更新的
修改之后再尝试增加,成功增加
在这里我们也能看到这里显示的数据与list_display有关,修改一下list_display
1 list_display = ('name', 'status', 'is_nav', 'owner', 'created_time')
可以看到作者显示了出来
编写Post的管理后台
1 @admin.register(Post) 2 class PostAdmin(admin.ModelAdmin): 3 list_display = [ 4 'title', 'category', 'status', 5 'created_time', 'operator', 6 ] 7 list_display_links = [] 8 9 list_filter = ['category', ] # 页面过滤器 10 search_fields = ['title', 'category__name'] # 配置搜索字段 11 12 actions_on_top = True 13 actions_on_bottom = True 14 15 # 编辑页面 16 save_on_top = True # 把保存,编辑,编辑并新建按钮展示在顶部 17 18 fields = ( 19 ('category', 'title'), 20 'desc', 21 'status', 22 'content', 23 'tag', 24 ) 25 26 def operator(self, obj): 27 return format_html( 28 '<a href="{}">编辑</a>', 29 reverse('admin:blog_post_change', args=(obj.id,)) 30 ) 31 operator.short_description = '操作' 32 33 def save_model(self, request, obj, form, change): 34 obj.owner = request.user 35 return super(PostAdmin, self).save_model(request, obj, form, change)
先在这里总结一下PostAdmin的各个配置
l list_display用来配置列表页面展示哪些字段
l list_display_links用来配置哪些字段可以作为链接,点击他们会进入编辑页面
l list_filter配置页面过滤器,需要通过哪些字段来过滤列表页
l search_fields配置搜索字段
l actions_on_top动作相关的配置,是否展示在顶部
l actions_on_bottom是否展示在底部
l save_on_top保存,编辑,新增是否显示在顶部
这里介绍一下operator, 这是我们自定义的字段,自定义函数的参数固定为当前行的对象.自定义函数可以返回HTML,但是要通过format_html函数处理,reverse的功能是根据名称反解析路由,而里面的blogApp_post_change我在官方文档中找到了答案.最后的operator.short_description的作用就是制定展示文案.
自定义函数我们经常用到,比如我们可以在'分类'列表页展示每一类有多少文章可以这样写
1 def posts_count(self, obj): 2 return obj.post_set.count() 3 4 posts_count.short_description = '文章数量'
记得修改list_display让他展示出来,最终效果
另外我们发现,在文章列表页展示中,分类是这样的
这是因为我们没有配置__str__方法,对于python的类中的魔术方法,请大家去翻阅文档.这里贴的是他人总结的.
1 def __str__(self): 2 return self.name
可以看到成功显示了分类的名字.
comment/admin.py配置
1 from django.contrib import admin 2 3 from comment.models import Comment 4 5 6 @admin.register(Comment) 7 class CommentAdmin(admin.ModelAdmin): 8 list_display = ('target', 'nickname', 'content', 'website', 'created_time')
config/admin.py配置
1 from django.contrib import admin 2 3 from config.models import Link, SideBar 4 5 6 @admin.register(Link) 7 class LinkAdmin(admin.ModelAdmin): 8 list_display = ('title', 'href', 'status', 'weight', 'created_time') 9 fields = ('title', 'href', 'status', 'weight') 10 11 def save_model(self, request, obj, form, change): 12 obj.owner = request.user 13 return super(LinkAdmin, self).save_model(request, obj, form, change) 14 15 16 @admin.register(SideBar) 17 class SideBarAdmin(admin.ModelAdmin): 18 list_display = ('title', 'display_type', 'content', 'created_time') 19 fields = ('title', 'display_type', 'content') 20 21 def save_model(self, request, obj, form, change): 22 obj.owner = request.user 23 return super(SideBarAdmin, self).save_model(request, obj, form, change)
到这里,我们已经得到一个完善的内容管理后台了
现在的问题是页面展示还不够友好,因此我们需要进行更多的配置,这个就留到明天继续吧!继续努力.