一、Django Admin
Django最强大的部分之一是自动生成的Admin界面。它读取模型中的元数据来提供一个强大的、生产环境就绪的界面,使内容提供者能立即用它向站点中添加内容。下面看一下如何激活,使用和定制Django的管理界面。
概述
通过使用startproject创建的默认项目模版中,Admin已启用。下面的一些要求作为参考:
1、添加 ‘django.contrib.admin’到INSTALLED_APPS设置中。
2、admin有四个依赖 – django.contrib.aut,django.contrib.contenttypes,django.contrib.messages和django.contrib.sessions;如果这些应用没有在INSTALLED_APPS列表中,那你要把它们添加到该列表中。
3、把django.contrib.messages.context_processors.messages添加到TEMPLATES中DjangoTemplates后台的’context_processors’选项中,同样把django.contrib.auth.middleware.AuthenticationMiddleware和django.contrib.messages.middleware.MessageMiddleware添加到MIDDLEWARE_CLASSES。(这些默认都是激活的,所以如果你手工操作过的话就需要按照以上方法进行设置..)
4、确定应用中的哪些模型应该在Admin界面中可以编辑。
5、修改${app_dir}/admin.py,给每个模型创建一个ModelAdmin类,封装模型自定义的Admin功能和选项。
6、实例化AdminSite并且告诉它你的每一个模块和ModelAdmin类。
7、将AdminSite实例绑定到URLconf。
做了这些步骤之后,你将能够通过你已经绑定的URL来访问Django管理站点(默认是/admin/)。虽然能访问了,但是还需要一个管理员账号来登录,需要提前创建一个管理员账号,如下:
1 |
$ python manage.py createsuperuser --username=admin --email=admin@admin.com |
然后就可以去访问:http://IP:PORT/admin/,使用管理员用户登录即可进入到管理后台界面,如下:
二、ModelAdmin
2.1 注册ModelAdmin
ModelAdmin类是模型在Admin界面中的表示形式,需要注册。通常,将它们写入在你的应用中的名为admin.py的文件里。下面来注册一个ModelAdmin:
1 2 3 4 5 6 7 8 |
# ./polls/admin.py from django.contrib import admin from .models import Question, Choice class QuestionAdmin(admin.ModelAdmin): pass admin.site.register(Question, QuestionAdmin) |
在上面的例子中,ModelAdmin并没有定义任何自定义的值。因此, 系统将使用默认的Admin 界面。如果对于默认的Admin 界面足够满意,那你根本不需要自己定义ModelAdmin 对象, 你可以直接注册模型类而无需提供ModelAdmin 的描述。那么上面的例子可以简化成:
1 2 3 4 |
from django.contrib import admin from .models import Question, Choice admin.site.register(Question) |
你还可以用register(*models[, site=django.admin.sites.site])装饰来注册您的ModelAdmin类:
1 2 3 4 5 6 |
from django.contrib import admin from .models import Question, Choice @admin.register(Question) class QuestionAdmin(admin.ModelAdmin): pass |
如果不使用默认的AdminSite,可以提供一个或多个模块类来注册ModelAdmin,并且一个可选择的关键参数site(这里使用装饰器来注册需要注册的类和模块的,请特别留意紧跟装饰器后面关于ModelAdmin的声明,前面是Author,后面是PersonAdmin,我的理解是后一种情况下注册的类都可以用PersonAdmin来作为接口):
2.2 ModelAdmin使用示例
继“Django写一个简单投票系统”这篇文章,我们对问题模型(Quesiton)和问题选项模型(Choice)进行注册到Admin后台,这样就可以借助Admin后台来进行添加问题和增加选项了。
Model信息修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# ./polls/models.py from django.db import models from django.utils import timezone class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text class Meta(): db_table = "question" ordering = ['-pub_date'] unique_together = (("question_text"),) index_together = [["pub_date", "question_text"],] class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text |
然后在应用的admin.py文件中进行Model注册到Admin后台的操作,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ./polls/admin.py # -*- coding: utf-8 -*- from django.contrib import admin from .models import Question, Choice @admin.register(Question) class QuestionAdmin(admin.ModelAdmin): pass @admin.register(Choice) class ChoiceAdmin(admin.ModelAdmin): pass |
然后Django服务器没有问题的情况下,就可以在Admin界面看到多了polls应用,以及Question和Choice模型,如下:
可以在这个界面进行添加问题,以及给这个问题添加对应的选项。
2.3 ModelAdmin选项
ModelAdmin非常灵活,它有几个选项来处理自定义界面。所有的选项都在ModelAdmin子类中定义:
1 2 3 4 5 6 7 8 9 10 11 12 |
# ./polls/admin.py @admin.register(Question) class QuestionAdmin(admin.ModelAdmin): search_fields = ['question_text'] date_hierarchy = 'pub_date' ordering = ['pub_date'] @admin.register(Choice) class ChoiceAdmin(admin.ModelAdmin): fields = ['question','choice_text'] search_fields = ['choice_text'] list_display = ['choice_text','question','votes'] |
fields:表示在Admin后台显示某些字段,默认显示所有字段。比如这里添加问题选项时,只需要选择问题以及填写选项即可,看不见vote字段了。
exclude:表示在Admin后台排除某些字段,默认显示所有字段。
search_fields:表示在Admin后台可以搜索某列,开启后在后台会出现搜索框,就可以模糊匹配了。
date_hierarchy:表示添加日期标签过滤,就是可以根据日期分类。
ordering:表示指定某个字段的排序规则。
list_display:表示在后台列表中显示更多的列,默认只显示一个objects。默认列为多对多关系时,就不能像上面那样直接使用了。
比如多对多关系,一本书有多个作者,一个作者也有多本书。
1 2 3 4 5 6 7 8 9 |
# 定义获取作者的函数; def book_authors_display(obj): return ','.join([author.name for author in obj.authors.all()]) # 定义一个显示名称; book_authors_display.short_description = 'author' # 应用到list_display; list_dispaly = [book_authors_display] |
在后台进行管理时,默认提供了一个action动作,是一个删除操作,我们可以根据需要自定义action,如下:
1 2 3 4 5 6 7 8 9 10 |
# ./polls/admin.py from django.utils import timezone def make_book_pub_date_to_now(modeladmin, request, queryset): queryset.update(pub_date=timezone.now()) make_book_pub_date_to_now.short_description = "Mark selected book pub_date as now" class QuestionAdmin(admin.ModelAdmin): actions = [make_book_pub_date_to_now] |
看一下后台界面如下:
这段代码,Django大概的处理方式为,发现actions参数,取函数。然后传入modeladmin、request、以及queryset;然后循环来修改我们选中传到后端的问题。
另外,当我们在Model Field中指定verbose_name参数时,如下配置:
1 2 3 4 |
# ./polls/models.py class Question(models.Model): question_text = models.CharField(max_length=200, verbose_name='问题') pub_date = models.DateTimeField('date published') |
我们在Admin后台就可以看到这个字段别名了,如下显示:
三、Xadmin
Xadmin是GitHub上的开源项目,它是Django admin的超强升级版,提供了强大的插件系统,丰富的内置功能,以及无与伦比的UI主题,使管理系统的实现变得异常简单。详情请参见官方网址。