Django后台
django的后台我们只要加少些代码,就可以实现强大的功能。
与后台相关文件:每个app中的 admin.py 文件与后台相关。
下面示例是做一个后台添加博客文章的例子:
一,新建一个 名称为 zqxt_admin 的项目
1
|
django-admin.py startproject zqxt_admin |
二,新建一个 叫做 blog 的app
1
2
3
4
5
|
# 进入 zqxt_admin 文件夹 cd zqxt_admin # 创建 blog 这个 app python manage.py startapp blog |
注意:不同版本的 Django 创建 project 和 app 出来的文件会有一些不同
三,修改 blog 文件夹中的 models.py
1
2
3
4
5
6
7
8
9
10
|
# 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中
1
2
3
4
5
6
7
8
9
10
|
INSTALLED_APPS = ( 'django.contrib.admin' , 'django.contrib.auth' , 'django.contrib.contenttypes' , 'django.contrib.sessions' , 'django.contrib.messages' , 'django.contrib.staticfiles' , 'blog' , ) |
提示:INSTALLED_APPS 是一个元组,每次加入新的app的时候,在后面都加一个逗号,这是一个好习惯。
五,同步所有的数据表
1
2
3
4
5
6
|
# 进入包含有 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不提示)用下面的命令创建一个帐号(密码输入看不到并不是不能输入)
1
|
python manage.py createsuperuser |
六,修改 admin.py
进入 blog 文件夹,修改 admin.py 文件(如果没有新建一个),内容如下
1
2
3
4
5
|
from django.contrib import admin from .models import Article admin.site.register(Article) |
只需要这三行代码,我们就可以拥有一个强大的后台!
提示:urls.py中关于 admin的已经默认开启,如果没有,参考这里。
七,打开 开发服务器
1
2
|
python manage.py runserver # 如果提示 8000 端口已经被占用,可以用 python manage.py runserver 8001 以此类推 |
访问 http://localhost:8000/admin/ 输入设定的帐号和密码, 就可以看到:
点击 Articles,动手输入 添加几篇文章,就可以看到:
我们会发现所有的文章都是叫 Article object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢?
我们修改一下 blog 中的models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 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呢?
示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 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,如何做呢?
1
2
3
4
5
6
7
|
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就是显示在文章上面的提示,默认值如果没有这个就是Article默认return的那个
list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如:
1
2
3
4
5
6
7
8
9
|
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中
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 及以上用以下命令来同步数据库表的更改
1
2
|
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方法
1
2
3
4
5
6
7
|
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及以上才有)
1
2
3
4
5
6
7
8
9
10
11
12
|
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.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人
1
2
3
4
5
6
|
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
如果需要获取修改前的对象的内容可以用
1
2
3
4
5
6
7
|
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,是修改就有
1
2
3
4
5
6
7
8
9
10
11
|
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, 删除时做一些处理,
1
2
3
4
5
6
7
8
9
|
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后台的更多相关文章
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...
- Django后台设置--遇到的问题与解决方案
1. 后台如何管理项目中的models 新建的Django工程会自动引用admin 应用,新建后台可以通过 createsuperuser 命令建立后台admin超级管理员,我遇到的第一个问题,就是如 ...
- Django 后台支持中文方法
今天遇到的一个问题,mark一下: django后台可以支持中文界面,一开始一直纠结于settings.py 中 LANGUAGE_CODE = 'en-us'中的'en-us'该更改成什么.zh-c ...
- 强大的Django后台管理
Django 后台 django的后台我们只要加少些代码,就可以实现强大的功能.与后台相关文件:每个app中的 admin.py 文件与后台相关 下面示例是做一个后台添加博客文章的例子: 新建一个 名 ...
- django后台导入excel文件
1.django 如何从后台上传excel中批量解析数据 要从django后台导入的excel中批量解析数据,举一个例子,我们向后抬批量导入svn历史数据数据格式 假设excel表中有4列,每列分别是 ...
- django后台获取相同name名的数据
django后台获取相同name名的post数据html: <form method="post"> <input type="text" n ...
- 1.1 、Django 后台
Django 后台 与后台相关文件:每个app中的 admin.py 文件与后台相关. 一,新建一个 名称为 HelloDjango 的项目 django-admin.py startproject ...
- jquery ajax 提交form表单 以及django后台接受
HTML <form id="project_file_upload" enctype="multipart/form-data" > <di ...
- 前台通过form表单向Django后台传输数据,Django处理后返回给前台
摘要:Django前后台数据传递 通过action将数据传输给apitest这个地址,使用get方法传递,此处需要传递name="request_method"的下拉列表值和nam ...
- django后台管理系统(admin)的简单使用
目录 django后台管理系统的使用 检查配置文件 检查根urls.py文件 启动项目,浏览器输入ip端口/admin 如: 127.0.0.1/8000/admin 回车 注册后台管理系统超级管理 ...
随机推荐
- 中国知网cnki(永久会员账号)
中国知网cnki(永久会员账号)大男孩免费分享 网站简介: (中国知网http://www.cnki.net/)中国知网是国家知识基础设施(National Knowledge Infrastru ...
- myeclipse2015卸载、安装、破解全过程-----myeclipse2015
myeclipse2015安装以及破解步骤: 下载地址:myeclipse2015-->https://pan.baidu.com/s/1i4RFCBb 密码:qxsu 破解文件地址--&g ...
- 总结移动安全的测试点及详解allowbackup漏洞
一.移动应用APP可能面临以下威胁: 木马--二次打包, 病毒--账号窃取, 篡改--资源篡改, 破解--广告植入, 钓鱼--信息劫持 二.移动终端APP安全评估的7个方向: 通信安全,敏感信息安全 ...
- 简单的SQL语句
说明:SQL语句大小写都可以,执行一句时,后面可不加分号,如果同时执行两句,就必须加分号,不然会报错. --+空格 是SQL的注释 表格名为users,里面有name和age属性 一.增 inser ...
- Tomcat7.0+ web.xml问题
Tomcat7+版本的web.xml都加上 <context-param> <param-name>webAppRootKey</param-name> <p ...
- AngularJS 动画
AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script src="htt ...
- 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...
- tmpfs详解
一,tmpfs介绍 1. tmpfs是一种虚拟内存文件系统,正如这个定义它最大的特点就是它的存储空间在VM里面(什么是VM?后面介绍) 2. VM是由linux内核里面的vm子系统管理的东西,现在大多 ...
- JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台
近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...
- 【Android】Eclipse自动编译NDK/JNI的三种方法
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...