Django开发博客系统(06-开发基础管理后台)

创建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')
Tag与Category

来运行一下看看效果.

创建超级用户

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)
重写save_model

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)
Post

先在这里总结一下PostAdmin的各个配置

list_display用来配置列表页面展示哪些字段

list_display_links用来配置哪些字段可以作为链接,点击他们会进入编辑页面

list_filter配置页面过滤器,需要通过哪些字段来过滤列表页

search_fields配置搜索字段

actions_on_top动作相关的配置,是否展示在顶部

actions_on_bottom是否展示在底部

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)

到这里,我们已经得到一个完善的内容管理后台了

 现在的问题是页面展示还不够友好,因此我们需要进行更多的配置,这个就留到明天继续吧!继续努力.

 

 

 

猜你喜欢

转载自www.cnblogs.com/ylnx-tl/p/12609279.html