创建Django项目
- 命令 django-admin startproject test1
打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入这些命令(不是 python 的 shell中)
如果是 windows 用 cmd(开始 搜索 cmd 或者 快捷键 win + R,输入 cmd) 直接在 cmd 上操作。
django-admin.py startproject project_name
特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试
注意 project_name 是自己的项目名称,需要为合法的 Python 包名,如不能为 1a 或 a-b。
进入test1目录,目录结构如下图:
Django目录说明
manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
内层的目录:项目的真正的Python包
_init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包
settings.py:项目的配置
urls.py:项目的URL声明
wsgi.py:项目与WSGI兼容的Web服务器入口
创建应用【新建app】
- 要先进入项目目录下,cd project_name 然后执行下面的命令(下同,已经在项目目录下则不需要 cd project_name)
python manage.py startapp app_name
或
django-admin.py startapp app_name
一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。
与项目名类似 app name 也需要为合法的 Python 包名,如 blog,news, aboutus 等都是合法的 app 名称。
示例:
python manage.py startapp booktest
应用的目录结构如下图
数据库配置
在settings.py文件中,通过DATABASES项进行数据库设置
django支持的数据库包括:sqlite、mysql等主流数据库
Django默认使用SQLite数据库
# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djangotest', 'USER': 'root', 'PASSWORD': '1234', 'HOST': '127.0.0.1', 'PORT': '3306', } }
下面解释一下,里面参数的意思:
ENGINE : 指定数据库驱动,不同的数据库这个字段不同,下面是常见的集中数据库的ENGINE的写法:
django.db.backends.postgresql #PostgreSQL
django.db.backends.mysql # mysql
django.db.backends.sqlite3 # sqlite
django.db.backends.oracle # oracle
NAME:指定的数据库名,如果是sqlite的话,就需要填数据库文件的绝对位置
USER:数据库登录的用户名,mysql一般都是root
PASSWORD:登录数据库的密码,必须是USER用户所对应的密码
HOST:由于一般的数据库都是C/S结构的,所以得指定数据库服务器的位置,
我们一般数据库服务器和客户端都是在一台主机上面,所以一般默认都填127.0.0.1
PORT:数据库服务器端口,mysql默认为3306
HOST和PORT都可以不填,使用默认的配置,但是如果你有更改默认配置的话,就需要填入更改后的
配置完这,只是最简单的一步,下面就需要装python连接mysql数据库的驱动程序,
首先,需要安装mysql的开发包,在shell,里面运行:
rpm -qa | grep mysql-devel
如果没有安装,那就安装:
sudo yum install mysql-devel
#python2.7:
sudo pip install MySQLdb
#python3.6:
sudo pip install PyMySQL
或者下载mysql驱动
pip install mysqlclient
配置驱动:pymysql.install_as_MySQLdb()
在项目的init文件中导入
import pymysql
pymysql.install_as_MySQLdb()
这一步必须要,不然会报错:找不到mysqldb 包,因为django中默认为mysql 驱动包名为MySQLdb,
但是我们安装的是 pymysql 所以有这一步
安装好后,启动django
python manager.py runserver
如果没有出现报错,则表明配置正常,然后在新的shell运行:
python manager.py shell
输入以下命令:
from django.db import connection
cursor = connection.cursor()
- 如果没有报错,则就表明安装成功,你可以尽情使用django的数据库功能了
定义模型类
有一个数据表,就有一个模型类与之对应
打开models.py文件,定义模型类
引入包from django.db import models
模型类继承自models.Model类
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
当输出对象时,会调用对象的str方法
设计介绍
本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书、英雄
图书表结构设计:
表名:BookInfo
图书名称:btitle
图书发布时间:bpub_date
英雄表结构设计:
表名:HeroInfo
英雄姓名:hname
英雄性别:hgender
英雄简介:hcontent
所属图书:hbook
图书-英雄的关系为一对多
定义模型【models.py】
from django.db import models class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() def __str__(self): return "%d" % self.pk class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField() hcontent = models.CharField(max_length=100) hBook = models.ForeignKey('BookInfo') def __str__(self): return "%d" % self.pk
生成数据表
激活模型:编辑settings.py文件,将booktest应用加入到installed_apps中
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', ]
生成迁移文件:根据模型类生成sql语句
python manage.py makemigrations
迁移文件被生成到应用的migrations目录
执行迁移:执行sql语句生成数据表
python manage.py migrate
新建app创建数据库表 或 更改数据库表或字段
Django 1.7.1及以上 用以下命令
# 1. 创建更改的文件
python manage.py makemigrations
# 2. 将生成的py文件应用到数据库
python manage.py migrate
旧版本的Django 1.6及以下用
python manage.py syncdb
这种方法可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL。
备注:对已有的 models 进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具 south,
详见 Django 数据库迁移 一节。
- 清空数据库
python manage.py flush
此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。
- 创建超级管理员
python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
# 修改 用户密码可以用:
python manage.py changepassword username
- 导出数据 导入数据
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
关于数据操作 详见:数据导入数据迁移,现在了解有这个用法就可以了
- Django 项目环境终端
python manage.py shell
如果你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。
这个命令和 直接运行 python 或 bpython 进入 shell 的区别是:
你可以在这个 shell 里面调用当前项目的 models.py 中的 API,
对于操作数据,还有一些小测试非常方便。
- 数据库命令行
python manage.py dbshell
Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。
在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。
- 更多命令
终端上输入 python manage.py
可以看到详细的列表,在忘记子名称的时候特别有用。
1. Type 'manage.py help <subcommand>' for help on a specific subcommand. 2. 3. 4. 5. Available subcommands: 6. 7. 8. 9. [auth] 10. 11. changepassword 12. 13. createsuperuser 14. 15. 16. 17. [contenttypes] 18. 19. remove_stale_contenttypes 20. 21. 22. 23. [django] 24. 25. check 26. 27. compilemessages 28. 29. createcachetable 30. 31. dbshell 32. 33. diffsettings 34. 35. dumpdata 36. 37. flush 38. 39. inspectdb 40. 41. loaddata 42. 43. makemessages 44. 45. makemigrations 46. 47. migrate 48. 49. sendtestemail 50. 51. shell 52. 53. showmigrations 54. 55. sqlflush 56. 57. sqlmigrate 58. 59. sqlsequencereset 60. 61. squashmigrations 62. 63. startapp 64. 65. startproject 66. 67. test 68. 69. testserver 70. 71. 72. 73. [sessions] 74. 75. clearsessions 76. 77. 78. 79. [staticfiles] 80. 81. collectstatic 82. 83. findstatic 84. 85. runserver
- 测试数据操作
- 进入python shell,进行简单的模型API练习
python manage.py shell
- 进入shell后提示如下:
D:\WorkSpace\python\Django\test1>python manage.py shell
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
- 引入需要的包:
from booktest.models import BookInfo,HeroInfo
from django.utils import timezone
from datetime import *
- 查询所有图书信息:
BookInfo.objects.all()
- 新建图书信息:
b = BookInfo()
b.btitle="射雕英雄传"
b.bpub_date=datetime(year=1990,month=1,day=10)
b.save()
- 查找图书信息:
b=BookInfo.objects.get(pk=1)
- 输出图书信息:
b
b.id
b.btitle
- 修改图书信息:
b.btitle=u"天龙八部"
b.save()
- 删除图书信息:
b.delete()
- 关联对象的操作
- 对于HeroInfo可以按照上面的操作方式进行
- 添加,注意添加关联对象
h=HeroInfo()
h.htitle=u'郭靖'
h.hgender=True
h.hcontent=u'降龙十八掌'
h.hBook=b
h.save()
- 获得关联集合:返回当前book对象的所有hero
b.heroinfo_set.all()
返回:
<QuerySet [<HeroInfo: 1>]>
- 有一个HeroInfo存在,必须要有一个BookInfo对象,提供了创建关联的数据:
h=b.heroinfo_set.create(htitle=u'黄蓉',hgender=False,hcontent=u'打狗棍法')
- 服务器
- 运行如下命令可以开启服务器
python manage.py runserver ip:port
- 可以不写ip,默认端口为8000
- 这是一个纯python编写的轻量级web服务器,仅在开发阶段使用
- 服务器成功启动后,提示如下信息
D:\WorkSpace\python\Django\test1>python manage.py runserver 8080
Performing system checks...
System check identified no issues (0 silenced).
September 08, 2017 - 21:30:05
Django version 1.11.5, using settings 'test1.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
[08/Sep/2017 21:30:16] "GET / HTTP/1.1" 200 1716
Not Found: /favicon.ico
[08/Sep/2017 21:30:17] "GET /favicon.ico HTTP/1.1" 404 1961
- 默认端口是8000,可以修改端口
python manage.py runserver 8080
- 打开浏览器,输入网址“127.0.0.1:8000”可以打开默认页面
- 如果修改文件不需要重启服务器,如果增删文件需要重启服务器
- 通过ctrl+c停止服务器
- 管理操作
- 站点分为“内容发布”和“公共访问”两部分
- “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。
- 为此,Django会根据定义的模型类完全自动地生成管理模块
- 使用django的管理
- 创建一个管理员用户
python manage.py createsuperuser,按提示输入用户名、邮箱、密码
- 启动服务器,通过“127.0.0.1:8000/admin”访问,输入上面创建的用户名、密码完成登录
- 进入管理站点,默认可以对groups、users进行管理
- 管理界面本地化
- 编辑settings.py文件,设置编码、时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
- 向admin注册booktest的模型
- 打开booktest/admin.py文件,注册模型
from django.contrib import admin
from models import BookInfo
admin.site.register(BookInfo)
- 刷新管理页面,可以对BookInfo的数据进行增删改查操作
- 问题:如果在str方法中返回中文,在修改和添加时会报ascii的错误
- 解决:在str()方法中,将字符串末尾添加“.encode('utf-8')”【针对Python2】
- 自定义管理页面
- Django提供了admin.ModelAdmin类
- 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
class QuestionAdmin(admin.ModelAdmin):
...
admin.site.register(Question, QuestionAdmin)
- 示例:
from django.contrib import admin
from booktest.models import BookInfo
#自定义管理页面
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['pk', 'btitle', 'bpub_date']
admin.site.register(BookInfo, BookInfoAdmin)
- 列表页属性
- list_display:显示字段,可以点击列头进行排序
list_display = ['pk', 'btitle', 'bpub_date']
- list_filter:过滤字段,过滤框会出现在右侧
list_filter = ['btitle']
- search_fields:搜索字段,搜索框会出现在上侧
search_fields = ['btitle']
- list_per_page:分页,分页框会出现在下侧
list_per_page = 10
- 添加、修改页属性
- fields:属性的先后顺序
fields = ['bpub_date', 'btitle']
- fieldsets:属性分组
fieldsets = [
('basic',{'fields': ['btitle']}),
('more', {'fields': ['bpub_date']}),
]
- 关联对象
- 对于HeroInfo模型类,有两种注册方式
- 方式一:与BookInfo模型类相同
- 方式二:关联注册
- 按照BookInfor的注册方式完成HeroInfo的注册
- 接下来实现关联注册
from django.contrib import admin from models import BookInfo,HeroInfo class HeroInfoInline(admin.StackedInline): model = HeroInfo extra = 2 class BookInfoAdmin(admin.ModelAdmin): inlines = [HeroInfoInline] admin.site.register(BookInfo, BookInfoAdmin)
- 可以将内嵌的方式改为表格
class HeroInfoInline(admin.TabularInline)
布尔值的显示
- 发布性别的显示不是一个直观的结果,可以使用方法进行封装
def gender(self): if self.hgender: return '男' else: return '女' gender.short_description = '性别'
在admin注册中使用gender代替hgender
class HeroInfoAdmin(admin.ModelAdmin): list_display = ['id', 'hname', gender, 'hcontent']
完整示例
def gender(self): if self.hgender: return '男' else: return '女' gender.short_description = '性别' class HeroInfoAdmin(admin.ModelAdmin): list_display = ['id', 'hname', gender, 'hcontent'] admin.site.register(HeroInfo,HeroInfoAdmin) class HeroInfoInline(admin.TabularInline): model = HeroInfo extra = 2
参考来源: http://blog.csdn.net/it_dream_er/article/details/52092262