强大的Django后台管理
Django 后台
django的后台我们只要加少些代码,就可以实现强大的功能。与后台相关文件:每个app中的 admin.py 文件与后台相关
下面示例是做一个后台添加博客文章的例子:
新建一个 名称为 zqxt_admin 的项目
django-admin.py startproject zqxt_admin
新建一个 叫做 blog 的app
# 进入 zqxt_admin 文件夹
cd zqxt_admin # 创建 blog 这个 app
python manage.py startapp blog
注意:不同版本的 Django 创建 project 和 app 出来的文件会有一些不同
修改 blog 文件夹中的 models.py
# coding:utf-8
from django.db import models class Article(models.Model):
title = models.CharField(u'标题', max_length=256)
content = models.TextField(u'内容') pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)
把 blog 加入到settings.py中的INSTALLED_APPS中
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles', 'blog',
)
提示:INSTALLED_APPS 是一个元组,每次加入新的app的时候,在后面都加一个逗号,这是一个好习惯。
同步所有的数据表
# 进入包含有 manage.py 的文件夹
python manage.py makemigrations
python manage.py migrate 注意:Django 1.6.x 及以下的版本需要用以下命令
python manage.py syncdb
可以看到:
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table blog_article
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'tu'): tu
Email address:
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
如果是 Django 不主动提示创建管理员(Django 1.9不提示)用下面的命令创建一个帐号
python manage.py createsuperuser
进入 blog 文件夹,修改 admin.py 文件(如果没有新建一个),内容如下修改 admin.py
from django.contrib import admin
from .models import Article admin.site.register(Article)
提示:urls.py中关于 admin的已经默认开启,如果没有,参考这里。只需要这三行代码,我们就可以拥有一个强大的后台!
打开 开发服务器
python manage.py runserver
# 如果提示 8000 端口已经被占用,可以用 python manage.py runserver 8001 以此类推
根据已经存在的路由进入登陆页面,并输入用户名和密码就可以使用后台进行管理了
点击 Articles,动手输入 添加几篇文章,就可以看到:

我们会发现所有的文章都是叫 Article object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢?
我们修改一下 blog 中的models.py
# coding:utf-8
from django.db import models class Article(models.Model):
title = models.CharField(u'标题', max_length=256)
content = models.TextField(u'内容') pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True) def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__
return self.title
我们加了一个 __unicode__ 函数,刷新后台网页,会看到:
所以推荐定义 Model 的时候 写一个 __unicode__ 函数(或 __str__函数)
技能提升:如何兼容python2.x和python3.x呢?
示例如下:
# coding:utf-8
from __future__ import unicode_literals from django.db import models
from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible
class Article(models.Model):
title = models.CharField('标题', max_length=256)
content = models.TextField('内容') pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable = True)
update_time = models.DateTimeField('更新时间',auto_now=True, null=True) def __str__(self):
return self.title
八,在列表显示与字段相关的其它内容python_2_unicode_compatible 会自动做一些处理去适应python不同的版本,本例中的 unicode_literals 可以让python2.x 也像 python3 那个处理 unicode 字符,以便有更好地兼容性。
后台已经基本上做出来了,可是如果我们还需要显示一些其它的fields,如何做呢?
from django.contrib import admin
from .models import Article class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','pub_date','update_time',) admin.site.register(Article,ArticleAdmin)
list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50) def my_property(self):
return self.first_name + ' ' + self.last_name
my_property.short_description = "Full name of the person" full_name = property(my_property)
在admin.py中
from django.contrib import admin
from .models import Article, Person class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date', 'update_time',) class PersonAdmin(admin.ModelAdmin):
list_display = ('full_name',) admin.site.register(Article, ArticleAdmin)
admin.site.register(Person, PersonAdmin)
到这里我们发现我们又有新的需求,比如要改 models.py 中的字段,添加一个文章的状态(草稿,正式发布),这时候我们就需要更改表,django 1.7以前的都不会自动更改表,我们需要用第三方插件 South,参见 Django 迁移数据。
Django 1.7 及以上用以下命令来同步数据库表的更改
python manage.py makemigrations
python manage.py migrate
zqxt_admin (Django 1.6).zip (基于Django 1.6,后台帐号 tu 密码 zqxt)本节代码下载:
zqxt_admin (Django 1.9).zip (基于 Django 1.9 后台帐号 tu 密码 ziqiangxuetang)
其它一些常用的功能:
搜索功能:search_fields = ('title', 'content',) 这样就可以按照 标题或内容搜索了
筛选功能:list_filter = ('status',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
新增或修改时的布局顺序:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets
有时候我们需要对django admin site进行修改以满足自己的需求,那么我们可以从哪些地方入手呢?
以下举例说明:
1.定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法
class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyModelAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(author=request.user)
该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的
2.定制搜索功能(django 1.6及以上才有)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
search_fields = ('name',) def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
try:
search_term_as_int = int(search_term)
queryset |= self.model.objects.filter(age=search_term_as_int)
except:
pass
return queryset, use_distinct
queryset 是默认的结果,search_term 是在后台搜索的关键词
3.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人
from django.contrib import admin class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
obj.save()
其中obj是修改后的对象,form是返回的表单(修改后的),当新建一个对象时 change = False, 当修改一个对象时 change = True
如果需要获取修改前的对象的内容可以用
from django.contrib import admin class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj_original = self.model.objects.get(pk=obj.pk)
obj.user = request.user
obj.save()
那么又有问题了,这里如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有
from django.contrib import admin class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if change:# 更改的时候
obj_original = self.model.objects.get(pk=obj.pk)
else:# 新增的时候
obj_original = None obj.user = request.user
obj.save()
4, 删除时做一些处理
from django.contrib import admin class ArticleAdmin(admin.ModelAdmin):
def delete_model(self, request, obj):
"""
Given a model instance delete it from the database.
"""
# handle something here
obj.delete()
强大的Django后台管理的更多相关文章
- django后台管理-admin
0922自我总结 django后台管理-admin 一.模型注册 admin.py 注册方式一: #在对于注册的app中的admin文件中导入模型然后注册模型 admin.site.register( ...
- Django——后台管理
1.要使用Django-admin后台的前提 INSTALLED_APPS = [ 'simpleui', 'django.contrib.admin', #必须有这一项 'django.contri ...
- Django后台管理的使用
Django后台管理的使用 参考文章:https://www.runoob.com/django/django-admin-manage-tool.html 1.编写好models 直接在admin. ...
- Django后台管理界面
之前的几篇记录了模板视图.模型等页面展示的相关内容,这篇主要写一下后台admin管理界面的内容. 激活管理界面 Django管理站点完全是可选择的,之前我们是把这些功能给屏蔽掉了.记得上篇中Djang ...
- Django 后台管理xadmin
一. xadmin的使用 后台管理在开发中可以给我们提供很大的便利,django自带了一个后台管理admin,不过还有一个xadmin比django自带的好用一些,功能更加强大,为模型提供了版本控制, ...
- django后台管理-ModelAdmin对象
Django最强大的部分之一是自动生成的管理后台界面. 它从你的模型中读取元数据,以提供一个快速的.以模型为中心的界面,信任的用户可以在这里管理你网站上的内容. 建议管理后台仅作为组织的一个内部管理工 ...
- [oldboy-django][1初始django]后台管理页面的布局 + djano母版(继承html)
完善学员管理系统 - bootstrap fontawesome - 分页,路径导航,表格(class样式),消息图标(i标签),邮件图标(i标签) - 响应式导航 @media(min-width, ...
- Django 后台管理 之登录和注销
Session: session是服务器端生成保存的一个键值对 , session内部机制依赖于cookie . 用户登录后返回给客户端一个随机字符串,客户端带着随机字符串访问服务器,用于验证 ...
- django后台管理
后台管理 1) 本地化 语言和时区的本地化. 修改settings.py文件. # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ ...
随机推荐
- jquery $.ajax $.get $.post的区别?
$.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...
- python读取大文件
最近在学习python的过程中接触到了python对文件的读取.python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.rea ...
- Yii2 数据缓存/片段缓存/页面缓存/Http缓存
- 如何在Sitecore CMS中创建没有标准字段的模板
当创建一个模板,Sitecore的将默认为扩大“标准模板”,它位于/sitecore/templates/System/Templates. 如果您选择不扩展任何模板或从“基本模板”字段中删除标准模板 ...
- MySql 学习参考目录
[1]< MySql 数据类型> [2]< MySql 基础 > [3]< MySql 存储过程 > PS:个人认为,如上总结超值. Good Good Study ...
- activemq消息队列的使用及应用docker部署常见问题及注意事项
activemq消息队列的使用及应用docker部署常见问题及注意事项 docker用https://hub.docker.com/r/rmohr/activemq/配置在/data/docker/a ...
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- 解决keepalived脑裂问题
检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: #!/bin/bash # 检查脑裂的脚本,在备节点上进行部署 LB01_VI ...
- vue -resource 文件提交提示process,或者拦截处理
this.$http.post('url',fd||data,{emulateJSON:true}).then(fn(res){},fn(res){}) process成功案例 _self.$http ...
- 关于scrapy下载文件重命名的办法以及对应url没有文件后缀的办法
https://www.jianshu.com/p/d1bb28cbb6a8 scrapy中负责下载文件的是class MyFilesPipeline(FilesPipeline)类 其中负责下载文件 ...