Admin站点
内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块。
说明:案例以地区数据举例
1)准备工作:创建管理员的用户名和密码。
python manage.py createsuperuser 按提示填写用户名、邮箱、密码。
2)使用:在应用的admin.py中注册模型类
例:打开booktest/admin.py文件,注册地区模型。
from django.contrib import admin from models import * admin.site.register(AreaInfo)
3)输入如下网址:
http://127.0.0.1:8000/admin/
按提示填写用户名、密码,点击“Log in”按钮登录
登录成功后,可以看到AreaInfos,可以进行增加、修改、删除、查询的管理。
控制管理页展示
类ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式。
1)在booktest/admin.py中,注册模型类前定义管理类AreaAdmin。
class AreaAdmin(admin.ModelAdmin): pass
管理类有两种使用方式:
- 注册参数
- 装饰器
注册参数:打开booktest/admin.py文件,注册模型类代码如下:
admin.site.register(AreaInfo,AreaAdmin)
装饰器:打开booktest/admin.py文件,在管理类上注册模型类,代码如下:
@admin.register(AreaInfo) class AreaAdmin(admin.ModelAdmin): pass
列表页选项
页大小
每页中显示多少条数据,默认为每页显示100条数据,属性如下:
list_per_page=100
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): list_per_page = 10
"操作选项"的位置
顶部显示的属性,设置为True在顶部显示,设置为False不在顶部显示,默认为True。
actions_on_top=True
底部显示的属性,设置为True在底部显示,设置为False不在底部显示,默认为False。
actions_on_bottom=False
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... actions_on_top = True actions_on_bottom = True
列表中的列
属性如下:
list_display=[模型字段1,模型字段2,...]
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle']
点击列头可以进行升序或降序排列。
将方法作为列
列可以是模型字段,还可以是模型方法,要求方法有返回值。
1)打开booktest/models.py文件,修改AreaInfo类如下:
class AreaInfo(models.Model): ... def title(self): return self.atitle
2)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle','title']
方法列是不能排序的,如果需要排序需要为方法指定排序依据。(点击列标题可排序)
admin_order_field=模型类字段
1)打开booktest/models.py文件,修改AreaInfo类如下:
class AreaInfo(models.Model): ... def title(self): return self.atitle title.admin_order_field='atitle'
列标题
列标题默认为属性或方法的名称,可以通过属性设置。需要先将模型字段封装成方法,再对方法使用这个属性,模型字段不能直接使用这个属性。
short_description='列标题'
1)打开booktest/models.py文件,修改AreaInfo类如下:
class AreaInfo(models.Model):
def title(self):
return self.atitle
title.short_description='区域名称'
关联对象
无法直接访问关联对象的属性或方法,可以在模型类中封装方法,访问关联对象的成员。
1)打开booktest/models.py文件,修改AreaInfo类如下:
def parent(self): # 需要判断是否有上级地区,省的上级地区为空 if self.aparent: return self.aparent.atitle return 'None'
2)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle','title','parent']
右侧栏过滤器
属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复值的字段。
list_filter=[]
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... list_filter=['atitle']
搜索框
属性如下,用于对指定字段的值进行搜索,支持模糊查询。列表类型,表示在这些字段上进行搜索。
search_fields=[]
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... search_fields=['atitle']
中文标题
1)打开booktest/models.py文件,修改模型类,为属性指定verbose_name参数,即第一个参数。
class AreaInfo(models.Model): atitle=models.CharField(verbose_name='标题',max_length=30)#名称 ...
编辑页选项
显示字段顺序(通过以下的射值可以改变编辑页顺序显示的顺序)
属性如下:
fields=[]
2)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... fields=['aParent','atitle']
修改编辑页对象的显示名称
在下拉列表中输出的是对象的名称,可以在模型类中定义str方法用于对象转换字符串。
1)打开booktest/models.py文件,修改AreaInfo类,添加str方法。
class AreaInfo(models.Model): ... def __str__(self): return self.atitle.encode('utf-8')
分组显示
注意:这项和fields只能出现一个,互斥的
属性如下:
fieldset=( ('组1标题',{'fields':('字段1','字段2')}), ('组2标题',{'fields':('字段3','字段4')}), )
1)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... # fields=['aParent','atitle'] fieldsets = ( ('基本', {'fields': ['atitle']}), ('高级', {'fields': ['aParent']}) )
说明:fields与fieldsets两者选一使用。
关联对象
在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种。 类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑。子类TabularInline:以表格的形式嵌入。
子类StackedInline:以块的形式嵌入。
1)打开booktest/admin.py文件,创建AreaStackedInline类。
class AreaStackedInline(admin.StackedInline): model = AreaInfo#关联子对象 extra = 2#额外编辑2个子对象
2)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... inlines = [AreaStackedInline]
可以用表格的形式嵌入。
1)打开booktest/admin.py文件,创建AreaTabularInline类。
class AreaTabularInline(admin.TabularInline): model = AreaInfo#关联子对象 extra = 2#额外编辑2个子对象
2)打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin): ... inlines = [AreaTabularInline]
重写模板
1)在templates/目录下创建admin目录
2)打开当前虚拟环境中Django的目录,再向下找到admin的模板,目录如下:
/home/python/.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/templates/admin
3)将需要更改文件拷贝到(在项目的templates文件夹里面创建admin文件夹)里,此处以base_site.html为例。

{% extends "admin/base.html" %} {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> <hr> <h1>自定义的管理页模板</h1> <hr> {% endblock %} {% block nav-global %}{% endblock %}
4)即可看到效果
其它后台的模板可以按照相同的方式进行修改。
上传图片
创建包含图片的模型类
将模型类的属性定义成models.ImageField类型。
1)打开booktest/models.py文件,定义模型类PicTest。
class PicTest(models.Model): pic = models.ImageField(upload_to='booktest/')
2)回到命令行中,生成迁移。
python manage.py makemigrations
3)回到命令行中,执行迁移。
python manage.py migrate
4)打开test5/settings.py文件,设置图片保存路径。因为图片也属于静态文件,所以保存到static目录下。
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
5)在static目录下创建media目录,再创建应用名称的目录,此例为booktest
在管理页面admin中上传图片
1)打开booktest/admin.py文件,注册PicTest。
from django.contrib import admin from models import * admin.site.register(PicTest)
2)运行服务器,输入如下网址。
http://127.0.0.1:8000/admin/
3)点击“Add”添加数据,打开新页面。
4)选择图片,点击“save”按钮完成图片上传。
5)回到数据库命令行,查询即可
6)图片被保存到目录static/media/booktest/下
5)回到数据库命令行,查询即可
6)图片被保存到目录static/media/booktest/下