Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等。
那么具体如何针对上一篇文章《》中的tag/post/category模型进行修改配置来实现呢?可以参考django官网文章:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overview
Django自动管理工具是django.contrib的一部分。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。 你可以把django.contrib看作是可选的Python标准库或普遍模式的实际实现。 它们与Django捆绑在一起,这样你在开发中就不用“重复发明轮子”了。
管理工具是本书讲述django.contrib的第一个部分。从技术层面上讲,它被称作django.contrib.admin。django.contrib中其它可用的特性,如用户鉴别系统(django.contrib.auth)、支持匿名会话(django.contrib.sessioins)以及用户评注系统(django.contrib.comments)。这些,我们将在第十六章详细讨论。在成为一个Django专家以前,你将会知道更多django.contrib的特性。 目前,你只需要知道Django自带很多优秀的附加组件,它们都存在于django.contrib包里。
激活管理界面
Django管理站点完全是可选择的,因为仅仅某些特殊类型的站点才需要这些功能。 这意味着你需要在你的项目中花费几个步骤去激活它。
第一步,对你的settings文件做如下这些改变:
-
将'django.contrib.admin'加入setting的INSTALLED_APPS配置中 (INSTALLED_APPS中的配置顺序是没有关系的, 但是我们喜欢保持一定顺序以方便人来阅读)
-
保证INSTALLED_APPS中包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions',Django的管理工具需要这3个包。 (如果你跟随本文制作mysite项目的话,那么请注意我们在第五章的时候把这三项INSTALLED_APPS条目注释了。现在,请把注释取消。)
-
确保MIDDLEWARE_CLASSES 包含'django.middleware.common.CommonMiddleware'、'django.contrib.sessions.middleware.SessionMiddleware'和'django.contrib.auth.middleware.AuthenticationMiddleware' 。
运行 python manage.py syncdb (
Django 1.7.1及以上 用以下命令# 1. 创建更改的文件python manage.py makemigrations# 2. 将生成的py文件应用到数据库python manage.py migrate旧版本的Django 1.6及以下用python manage.py syncdb
)。这一步将生成管理界面使用的额外数据库表。 当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。 如果你不这么作,你需要运行python manage.py createsuperuser来另外创建一个admin的用户帐号,否则你将不能登入admin (提醒一句: 只有当INSTALLED_APPS包含'django.contrib.auth'时,python manage.py createsuperuser这个命令才可用.)
第三,将admin访问配置在URLconf(记住,在urls.py中). 默认情况下,命令django-admin.py startproject生成的文件urls.py是将Django admin的路径注释掉的,你所要做的就是取消注释。 请注意,以下内容是必须确保存在的:
# Include these import statements...from django.contrib import adminadmin.autodiscover()# And include this URLpattern...urlpatterns = patterns('', # ... (r'^admin/', include(admin.site.urls)), # ...)
当这一切都配置好后,现在你将发现Django管理工具可以运行了。 启动开发服务器(如前:`` python manage.py runserver`` ),然后在浏览器中访问:http://127.0.0.1:8000/admin/
要了解更多内容,请参考:《》
如何建tag/post/category实现后台自动管理功能?
如果想让后台自动管理只需要在blog\admin.py中添加如下代码即可:
# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.contrib import adminfrom models import Tagfrom models import Postfrom models import Categoryclass PostAdmin(admin.ModelAdmin): list_display = ['title', 'category', 'author', 'create_time', 'modify_time']class TagAdmin(admin.ModelAdmin): list_display = ['name', 'create_time', 'modify_time']class CategoryAdmin(admin.ModelAdmin): list_display = ['name', 'create_time', 'modify_time']admin.site.register(Tag, TagAdmin)admin.site.register(Post, PostAdmin)admin.site.register(Category, CategoryAdmin)
登录后台查看效果:
设置文章字段显示名称、排序、分页、筛选字段:
经过上边设置了后台管理,及设置了后台列表展示字段效果如下:
但是这样貌似不是特别美观,没有分页、没有搜索、没有默认排序、不可以在列表中修改category、没有按照发布日期搜索、及文章分类搜索功能,那么如何实现呢?
1)字段中文设置:
需要修改models.py中字段显示别名:
# coding:utf-8from __future__ import unicode_literalsfrom django.db import modelsfrom django.contrib.auth.admin import User# '''# 文章栏目(分类)实体# '''@python_2_unicode_compatibleclass Category(models.Model): name = models.CharField(u'文章栏目', max_length=128) # 文章栏目(分类)名称 create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=False) # 创建时间 modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True) # 修改时间 def __str__(self): return self.name# '''# 文章标签实体# '''@python_2_unicode_compatibleclass Tag(models.Model): name = models.CharField(u'文章标签', max_length=128) # 文章标签名称 create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=False) # 创建时间 modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True) # 修改时间 def __str__(self): return self.name# """# 文章实体# """@python_2_unicode_compatibleclass Post(models.Model): title = models.CharField(u'标题', max_length=128) # 文章标题,定义最大长度为128 ''' 如果不使用blank=True标识,则当该值为空时会保存操作会抛出异常 ''' summary = models.CharField(verbose_name=u'简介', max_length=256, blank=True) # 文章简介,定义最大长度为126。, type=models.CharField body = models.TextField(verbose_name=u'内容') # 文章内容,较长因此定义为TextField, type=models.TextField create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=True) # 文章创建时间 modify_time = models.DateTimeField(u'修改时间', auto_now=True, null=True) # 文章修改时间 views = models.PositiveIntegerField(default=0, verbose_name='阅读数') # 文章阅读数量,默认为0 ''' 一篇文章只能归属一个栏目,而一个栏目下可能会拥有多篇文章,因此这是一对多的关联关系。 关于用法请阅读:https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships ''' category = models.ForeignKey(Category, verbose_name='分类') # 文章分类 ''' 一篇文章允许有多个标签,一个标签允许被多篇文章使用,因此他们的关系是多对多关系,但是同时该值可以不设置,因此使用black=True标识该字段允许为空。 ''' tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True) # 文章标签 ''' # 由于django.contrib.auth 是 Django 内置的应用,它用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。 #一篇文章对应一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。 ''' author = models.ForeignKey(User, verbose_name='作者') # 文章作者 def __str__(self): return self.title def __unicode__(self): return self.title
2)设置文章筛选过滤、分页、搜索字段、默认排序、列表中可编辑category、快速筛选(发布时间、文章分类)
修改blog\admin.py
# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.contrib import adminfrom models import Tagfrom models import Postfrom models import Categoryclass PostAdmin(admin.ModelAdmin): list_display = ['title', 'category', 'author', 'create_time', 'modify_time']#设置列表显示字段 search_fields = ('title',) #设置搜索字段 list_filter = ('category','create_time',) #设置按照发布时间、分类快速筛选 list_per_page = 10 #设置分页 list_editable = ['category', ] #设置列表可编辑列class TagAdmin(admin.ModelAdmin): list_display = ['name', 'create_time', 'modify_time'] search_fields = ('name',)class CategoryAdmin(admin.ModelAdmin): list_display = ['name', 'create_time', 'modify_time'] search_fields = ('name',)admin.site.register(Tag, TagAdmin)admin.site.register(Post, PostAdmin)admin.site.register(Category, CategoryAdmin)
效果: