Django系列教程(11)——管理后台(Admin)入门

打印 上一主题 下一主题

主题 1538|帖子 1538|积分 4614

目录
为什么要利用Django Admin
怎样利用Django Admin
创建超级用户superuser
注册模子
自定义数据表显示选项
自定义list_display显示字段
优化ForeignKey或多对多字段的选择
利用Inline表单
小结


Django提供了一个开箱即用的专业、多功能的管理后台 (admin)。仅需几行代码,你就可以根据你的模子创建专业的管理后台,让受信托的用户可以管理您网站上的数据和内容。
为什么要利用Django Admin

Django自带的admin管理后台就像诸葛亮的媳妇黄月英,固然不漂亮,但却拥有和诸葛亮一样的才华。利用Django Admin,一行代码即可增加对一个模子(数据表)的增删查改。试想假如你要自己手动编写后台对一个模子进行增删查改,你一样平常需要4个urls, 4个视图函数或通用视图和4个模板。当一个项目比较大包含多个app时,而每个app又包含多个模子(数据表)时, 那么编写和维护整个项目管理后台的工作量可想而知。假如你的管理后台主要是内部人员利用,你完全不需要太过在意它的外观。
怎样利用Django Admin

创建超级用户superuser

利用Django admin的第一步是创建超级用户(superuser)。进入你的项目文件夹, 利用如下命名,输入用户名和暗码即可创建管理员。
  1. $ python manage.py createsuperuser
复制代码
此时你访问http://127.0.0.1:8000/admin/, 你就可以利用用户名和暗码登录了。


注册模子

假设你有一个叫blog的APP, 内里包含了一个叫Article的模子, 你想对文章进行管理, 你只需找到blog目录下的admin.py,利用admin.site.register方法注册Article模子。代码如下所示:
  1. #blog/admin.py
  2. from django.contrib import admin
  3. from .models import Article
  4. # Register your models here.
  5. admin.site.register(Article)
复制代码
此时你登录admin后点击Article模子,你会看到如下管理界面,点击标题即可对文章进行修改。不过只有文章的标题title被显示,太简单,没有显示作者,没有显示发布日期,也没有分页,也没有过滤条件。


自定义数据表显示选项

我们需要自定义数据表中哪些字段可以显示,哪些字段可以编辑,并对数据表中的条目进行排序,同时定义过滤选项。Django的ModelAdmin自带的list_display, list_filter, list_per_page, list_editable, date_hierarchy和ordering选项可以轻松帮我们做到。
要自定义数据表显示字段,我们只需对上述代码做出如下改进。我们先定义ArticleAdmin类,然后利用admin.site.register(Article, ArticleAdmin)方法即可。
  1. # blog/admin.py
  2. from django.contrib import admin
  3. from .models import Article
  4. from django.utils.html import format_html
  5. class ArticleAdmin(admin.ModelAdmin):
  6.     # 定制哪些字段需要展示
  7.     list_display = ('title', 'author', 'status', 'create_date', )
  8.    
  9.     # list_display_links = ('title', ) # 默认
  10.     # sortable_by # 排序
  11.     '''定义哪个字段可以编辑'''
  12.     list_editable = ('status', )
  13.     '''分页:每页10条'''
  14.     list_per_page = 5
  15.     '''最大条目'''
  16.     list_max_show_all = 200 #default
  17.     '''搜索框 ^, =, @, None=icontains'''
  18.     search_fields = ['title']
  19.     '''按日期分组'''
  20.     date_hierarchy = 'create_date'
  21.     '''默认空值'''
  22.     empty_value_display = 'NA'
  23.     '''过滤选项'''
  24.     list_filter = ('status', 'author__is_superuser', )
  25. admin.site.register(Article, ArticleAdmin)
复制代码
此时登录django后台访问Article模子你将看到如下基础显示效果。我们将从这里开始展示django自带admin后台更高级的用法。


自定义list_display显示字段

现在文章列表中的文章创建日期是英文字段,不是我们想要的。我们可以自定义一个时间格式(比如以2020-11-09 15:00)展示,并以赤色标注。
此时修改我们的admin.py, 在ArticleAdmin类中新增一个custom_date方法,把其加入list_display选项,如下所示:
  1. # Register your models here.
  2. class ArticleAdmin(admin.ModelAdmin):
  3.     # Custom admin list view
  4.     list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
  5.     '''中间省略'''   
  6.     '''custom field on list view'''
  7.     def custom_date(self, obj):
  8.         return format_html(
  9.             '<span style="color: red;">{}</span>',
  10.             obj.create_date.strftime("%Y-%m-%d %H:%M:%S")
  11.         )
  12.     custom_date.short_description = '定制格式及颜色'
复制代码
新的展示效果如下所示:


优化ForeignKey或多对多字段的选择

Django admin中添加或修改一个对象时,对ForeignKey字段默认利用下拉菜单显示。例如本例中文章模子的author是一个ForeignKey外键。当你在admin中创建新的文章时,你将看到如下界面。当作者很少的时候,你可以轻松选择文章作者。当用户非常多的时候,下拉菜单变得非常长,此时通过下拉菜单选择作者非常不方便,效率低下。


一个更好的方式是利用autocomplete_fields或者raw_id_fields。前者利用基于jquery select2带搜索框的下拉菜单,适合中等数目的选项。后者利用弹出窗口搜索对象,适合数目非常多的选项。
修改admin.py,添加autocomplete_fields
  1. # Register your models here.
  2. class ArticleAdmin(admin.ModelAdmin):
  3.     list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
  4.     '''中间省略'''
  5.     autocomplete_fields = ['author'] # use select2 to select user   
复制代码
autocomplete_fields的展示效果如下所示,效果好得惊人。


再修改admin.py, 利用raw_id_fields
  1. # Register your models here.
  2. class ArticleAdmin(admin.ModelAdmin):
  3.     list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
  4.     '''中间省略'''   
  5.     raw_id_fields = ("author",) # use a pop-out search window for a foreign key   
复制代码
raw_id_fields展示效果如下所示。ForeinKey字段旁多了个放大镜,展示效果也相称不错。


本例模子中不涉及多对多字段,但在实际应用中django admin对于多对多字段利用多选下拉菜单,也非常不方便,发起选择利用filter_horizontal或filter_vertical设置,其展示效果为双向穿梭选择器,如下所示:


利用Inline表单

本例中author和article是单对多的关系,前面案例中文章都是逐一添加的。假如我们盼望在创建或编辑用户的时候,就一次性添加多篇文章怎么操作呢? 答案是利用inline表单。
我们首先用Article模子创建两个Inline类,一个用于展示和编辑已创建的文章列表,一个用于一次性添加多篇文章。由于Article模子可能有多个ForeignKey(比如category或author), 我们这里必需通过fk_name选项指定在谁人ForeinKey的模子里利用创建的inlines类。
  1. from django.contrib.auth import get_user_model
  2. User = get_user_model()
  3. class ArticleListInline(admin.TabularInline):
  4.     model = Article
  5.     # Article模型可能有多个外键,这里指定使用author这个外键,
  6.     fk_name = "author"
  7.     # readonly_fields = ('title', 'body', 'status')
  8.     # can_delete = False
  9.     max_num = 3
  10.     verbose_name = _('Edit Articles')
  11.     verbose_name_plural = _('Edit Articles')
  12.     extra = 2 #
  13.     """ 不允许这个inline类增加记录  """
  14.     def has_add_permission(self, request, obj=None):
  15.         return False
  16. class ArticleAddInline(admin.TabularInline):
  17.     model = Article
  18.     fk_name = "author"
  19.     extra = 2
  20.     can_delete = False
  21.     verbose_name = _('Add Articles')
  22.     verbose_name_plural = _('Add Articles')
  23.     """ 这时仅用于添加数据的Inline,返回空的queryset """
  24.     def get_queryset(self, request):
  25.         queryset = super().get_queryset(request)
  26.         return queryset.none()
复制代码
然后将创建的ArticleInline类与UserAdmin相关联。
  1. class UserAdmin(admin.ModelAdmin):
  2.     search_fields = ['username']
  3.     inlines = [
  4.         ArticleAddInline,
  5.         ArticleListInline,
  6.     ]
  7. admin.site.unregister(User)
  8. admin.site.register(User, UserAdmin)
复制代码
此时当你创建或编辑用户时,你可以看到或编辑该用户已创建的文章。你还可以一次性为该用户添加多篇文章,如下所示:


小结

本文以实例展示了怎样自定义admin。在Django Admin进阶篇,我们会介绍怎样重写save_model, get_queryset等多种方法以及怎样自定义list_filter和actions。在接下来的入门教程里,我们会陆续介绍发送邮件、session、分页、图片和文件的上传和下载等基础知识。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表