- 假设在创建之初, 我们通过此命令来创建: $
django-admin startproject DjangoApp
- 后期将最外层目录修改为了:
Django-1.11.11
- 根据我们使用的Django版本的文档
-
$
python3 manage.py runserver
- 这样只能本机调试访问
-
$
python3 manage.py runserver 8080
- 该runserver命令在端口8000的内部IP上启动开发服务器。当然也可以指定端口开启服务,如8080端口
-
$
python3 manage.py runserver 0:8000
- 这样启动,通过
0
可以进行远程访问, 并且在settigns.py中ALLOWED_HOSTS添加自己的ip地址, 或支持所有 ALLOWED_HOSTS = ['*'] - runserver只能在本机使用, 是Django自带的http服务
- 部署时应使用uwsgi
- 这样启动,通过
1 ) 创建一个应用程序
-
Django自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。
-
要创建您的应用程序,请确保您与目录位于同一目录,manage.py 并键入以下命令:
- $
python3 manage.py startapp app
- $
-
这将创建一个目录app,其目录如下:
Django-1.11.11/ ├── manage.py ├── DjangoApp │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── app ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py
2 ) 编写我们的第一个视图
-
我们来写第一个视图。打开文件app/views.py 并放入以下Python代码:
from django.http import HttpResponse def index(request): return HttpResponse("Hello World!")
-
这是Django中最简单的视图。要调用视图,我们需要将其映射到一个URL - 为此,我们需要一个URLconf。
-
要在app目录中创建一个URLconf,创建一个名为urls.py。您的应用目录应该如下所示:
└── app ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py
-
在app/urls.py文件中包含以下代码:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
-
下一步是将根URLconf指向app.urls模块, 在DjangoApp/urls.py添加一条import用于django.conf.urls.include和插入include()的urlpatterns列表
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app/', include('app.urls')), ]
-
其中include()函数允许引用其他URLconfs。请注意,该include()函数的正则表达式 没有$(字符串匹配字符),而是尾部的斜杠。
-
每当Django遇到时 include(),它会排除与该点匹配的任何部分,并将剩余的字符串发送到随附的URLconf进行进一步处理。
-
背后的想法include()是使即插即用的URL变得容易。
-
注:include()当您包含其他网址格式时,您应始终使用。admin.site.urls是唯一的例外。
-
验证index视图连接到URLconf中, 运行以下命令:$
python manage.py runserver 0:8000
-
访问:http://0.0.0.0:8000/app/ 可见
Hello World!
输出
3 ) 关于url()函数的补充
- Django url() 可以接收四个参数,分别是两个必选参数:regex、view 和两个可选参数:kwargs、name,接下来详细介绍这四个参数。
- regex: 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view
- view: 用于执行与正则表达式匹配的 URL 请求
- kwargs: 视图使用的字典类型的参数
- name: 用来反向获取 URL
1 ) 连接MySQL数据库设置
- 默认情况下,配置使用SQLite。若不使用SQLite作为数据库,则需要额外的设置,例如 USER,PASSWORD和HOST必须加入。
- 其中ENGINE设置为数据库后端使用。内置数据库后端有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'
- 在DjangoApp/settings.py文件中,通过DATABASES项进行数据库设置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydemo', 'USER': 'root', 'PASSWORD': '', # 填入自己的密码 'HOST': 'localhost', 'PORT': '3306', } }
- 注意:Django使用MySQL数据库需要安装PyMySQL, $
pip3 install pymysql
- 打开 DjangoApp/init.py,写入以下代码导入pymysql:
import pymysql pymysql.install_as_MySQLdb()
2 ) 创建模型
- 在我们的简单的应用程序中,去创建一个stu表信息操作的Model类
- 编辑app/models.py文件
from django.db import models # Create your models here. class Stu(models.Model): '''自定义Stu表对应的Model类''' #定义属性:默认主键自增id字段可不写 id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) age = models.SmallIntegerField() sex = models.CharField(max_length=1) classid=models.CharField(max_length=8) # 定义默认输出格式 def __str__(self): return "%s:%s:%s:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid) # 自定义对应的表名,默认表名:app_stu class Meta: db_table="stu"
3 ) 激活模型
- 要将该应用程序包括在我们的项目中,我们需要在设置中添加对其配置类的引用INSTALLED_APPS
- 该appConfig是在app/apps.py文件中,所以它的访问路径'app.apps.AppConfig'
- 编辑DjangoApp/settings.py文件,并将该虚线路径添加到该INSTALLED_APPS设置
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig', # 这里或者直接写 'app' ]
4 ) 交互式的Python shell
- 使用Django提供的免费API
$ python3 manage.py shell Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 03:02:14) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from app.models import Stu >>> mod = Stu.objects >>> lists = mod.all() >>> for v in lists: ... print(v) ... 1:zhangsan:10:m:p01 2:lisi:12:m:p02 3:lily:9:w:p03 >>> mod.get(id=1) <Stu: 1:zhangsan:10:m:p01> >>> mod.get(id=2) <Stu: 2:lisi:12:m:p02> >>> mod.get(id=3) <Stu: 3:lily:9:w:p03> >>> quit()
5 ) 在app应用的视图中使用
-
文件:app/views.py 文件代码
from django.shortcuts import render from django.http import HttpResponse from app.models import Stu # Create your views here. def index(request): return HttpResponse("Hello Django!") def stu(request): #获取所有stu表信息 lists = Stu.objects.all() print(lists) #获取单条学生信息 print(Stu.objects.get(id=1)) return HttpResponse("ok")
-
配置stu函数的访问路由, 在app/urls.py文件中配置
url(r'^stu$', views.stu),
-
启动服务后,在浏览器中访问,在命令行终端中查看输出效果: http://0.0.0.0:8000/app/stu
1 ) 数据迁移
-
Django框架中有一个非常强大的应用功能--自动管理界面,常被Web平台管理者使用,去管理整个Web平台。
-
默认情况下,在settings.py配置文件中INSTALLED_APPS包含以下应用程序,这些应用程序都是由Django提供:
django.contrib.admin - 管理网站。你会很快使用它。
django.contrib.auth - 认证系统。
django.contrib.contenttypes - 内容类型的框架。
django.contrib.sessions - 会话框架。
django.contrib.messages - 消息框架。
django.contrib.staticfiles - 管理静态文件的框架。 -
为了后续的开发,默认这些应用程序都是包含在里面的。
-
使用这些Django自带的应用程序,需要我们在数据库中创建一些数据表对应,然后才能使用它们。为此,请运行以下命令(数据结构迁移):
- $
python3 manage.py migrate
- $
-
其中该migrate命令查看该INSTALLED_APPS设置,并根据DjangoApp/settings.py文件中的数据库设置和应用程序随附的数据库迁移创建任何必需的数据库表(稍后将介绍)。您会看到适用于每个迁移的消息。
$ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying sessions.0001_initial... OK
-
默认情况下自动在我们的数据库中创建了10张表,具体如下:
mysql> show tables; +----------------------------+ | Tables_in_mydb | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | stu | +----------------------------+ 11 rows in set (0.00 sec)
2 ) 创建管理员用户
- 首先,我们需要创建一个可以登录管理站点的用户。运行以下命令:假设我们设置的密码是
123456_admin
$ python3 manage.py createsuperuser Username (leave blank to use 'johnny'): Email address: [email protected] Password: Password (again): Superuser created successfully.
3 ) 启动开发服务器
- 默认情况下,Django管理员站点被激活。让我们开始开发服务器并探索它。
- 启动开发服务器命令如下: $
python3 manage.py runserver 0.0.0.0:8000
- 现在,打开一个Web浏览器,访问地址: http://0.0.0.0:8000/admin/ 输入我们的用户名/密码即可登录
4 ) 设置时区和语言
- 编辑DjangoApp/settings.py配置文件:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
5 ) 将我们自定义的应用程序的加入到后台管理
- 但我们的自定义应用程序在哪里?并没有显示在后台管理索引页面上。
- 要做到这一点,打开app/admin.py 文件,并编辑代码如下:
from django.contrib import admin from app.models import Stu admin.site.register(Stu)
6 ) 更深入设计后台管理
-
编辑app/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段
class Stu(models.Model): '''自定义Stu表对应的Model类''' #定义属性:默认主键自增id字段可不写 id = models.AutoField("学号",primary_key=True) name = models.CharField("姓名",max_length=16) age = models.SmallIntegerField("年龄") sex = models.CharField("性别",max_length=1) classid=models.CharField("班级",max_length=8) # 定义默认输出格式 def __str__(self): return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid) # 自定义对应的表名,默认表名:app_stu class Meta: db_table="stu" verbose_name = '浏览学生信息' verbose_name_plural = '学生信息管理'
-
编辑app/admin.py 文件,实现信息管理的个性化定制
from django.contrib import admin # Register your models here. from app.models import Stu #Stu模型的管理器(装饰器写法) @admin.register(Stu) class StuAdmin(admin.ModelAdmin): #listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键) list_display = ('id','name','age','sex','classid') #设置哪些字段可以点击进入编辑界面 list_display_links = ('id','name') #list_per_page设置每页显示多少条记录,默认是100条 list_per_page = 10 #ordering设置默认排序字段,负号表示降序排序 ordering = ('id',) #-id降序 #list_editable 设置默认可编辑字段 #list_editable = ['age','sex','classid'] #其他请详见手册文档说明