版本: 1.x和2.x, 2.x不支持python2版本,只支持py3.5及以上版本。1.x路由正则风格 2.x路由风格简单类似flask。
优点:大而全,封装多种功能,开启即用,目录结构适合中大型程序。
缺点:内含的功能有些用不上
官方教程:投票应用
第1节:请求和响应| 第2节:模型和admin站点
- 确认python版本和django版本已安装。
python -m django --version - 新建项目
django-admin startproject mysite
当前目录下创建一个mysite目录。
- 根目录下manage.py启动服务的入口。一个让你用各种方式管理 Django 项目的命令行工具。一个跟项目同名的mysite文件夹下是主要项目代码。有的项目中这个文件夹又叫做app、src。 settings.py设置。urls.py路由。wsgi.py打包应用部署相关。 models.pyORM相关的类。
views.py业务逻辑。 - mysite/settings.py:Django 项目的配置文件。
- mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”
- mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
-
\mysite>python manage.py runserver 切换目录 启动项目/开发者服务器
ctrl +C 服务停止 -
如果需要可以更换端口
\mysite>python manage.py runserver 8080 指定端口号
> python manage.py runserver 0:8000 -----0 是 0.0.0.0 的简写。 -
重新开一个终端 生成项目 创建投票应用 python manage.py startapp polls。 project是项目工程,app应用是项目中的一个功能模块。polls目录下的migrations是sql迁移脚本,admin.py后台插件,app.py,models.py定义表结构的类,tests.py单元测试,views.py业务逻辑和HTML渲染。
流程
浏览器请求url→mysite/urls.py→ polls.urls.py→ polls/views.py→ 返回响应浏览器展示
报错
- 安装django时报目录权限错误。解决使用管理员powershell pip 安装。
- 代码修改后未生效,服务器无log,原因进程未正常退出。解决 改端口或任务管理器中结束所有python.exe
3.getaddress函数报错。原因,计算机别名为中文
编写第一个视图
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index")
请在 polls 目录里新建一个 urls.py 文件
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
下一步是要在根 URLconf 文件中指定我们创建的 polls.urls 模块。在 mysite/urls.py 文件的 urlpatterns 列表里插入一个 include(), 如下:
mysite/url.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
函数 include() 允许引用其它 URLconfs。我们设计 include() 的理念是使其可以即插即用。因为投票应用有它自己的 URLconf( polls/urls.py ),他们能够被放在 “/polls/” , “/fun_polls/” ,"/content/polls/",或者其他任何路径下,这个应用都能够正常工作。
当包括其它 URL 模式时你应该总是使用 include() , admin.site.urls 是唯一例外。
你现在把 index 视图添加进了 URLconf。可以验证是否正常工作,运行下面的命令:
python manage.py runserver
用你的浏览器访问 http://localhost:8000/polls/,你应该能够看见 “Hello, world. You’re at the polls index.” ,这是你在 index 视图中定义的。
数据库配置
编辑 mysite/settings.py 文件前,先设置 TIME_ZONE 为你自己时区。
此外,关注一下文件头部的 INSTALLED_APPS 设置项。这里包括了会在你项目中启用的所有 Django 应用。应用能在多个项目中使用,你也可以打包并且发布应用,让别人使用它们。
通常, INSTALLED_APPS 默认包括了以下 Django 的自带应用:
- django.contrib.admin – 管理员站点, 你很快就会使用它。
- django.contrib.auth – 认证授权系统。
- django.contrib.contenttypes – 内容类型框架。
- django.contrib.sessions – 会话框架。
- django.contrib.messages – 消息框架。
- django.contrib.staticfiles – 管理静态文件的框架。
这些应用被默认启用是为了给常规项目提供方便。
默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令:
python manage.py migrate
创建模型
polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
每个字段都是 Field 类的实例 - 比如,
字符字段被表示为 CharField ,
日期时间字段被表示为 DateTimeField 。
定义某些 Field 类实例需要参数。例如 CharField 需要一个 max_length 参数。
Field 也能够接收多个可选参数;在上面的例子中:我们将 votes 的 default 也就是默认值,设为0
注意在最后,我们使用 ForeignKey 定义了一个关系。这将告诉 Django,每个 Choice 对象都关联到一个 Question 对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。
激活模型
为了在我们的工程中包含这个应用,我们需要在配置类 INSTALLED_APPS 中添加设置。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 ‘polls.apps.PollsConfig’。在文件 mysite/settings.py 中 INSTALLED_APPS 子项添加点式路径后,它看起来像这样:
mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
现在你的 Django 项目会包含 polls 应用。接着运行下面的命令:
python manage.py makemigrations polls
首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL:
python manage.py sqlmigrate polls 0001
现在,再次运行 migrate 命令,在数据库里创建新定义的模型的数据表:
python manage.py imgrate
现在,你只需要记住,改变模型需要这三步:
- 编辑 models.py 文件,改变模型。
- 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
- 运行 python manage.py migrate 来应用数据库迁移
初试API
现在让我们进入交互式 Python 命令行,尝试一下 Django 为你创建的各种 API。通过以下命令打开 Python 命令行:
python manage.py shell
当你成功进入命令行后,来试试 database API 吧:
from polls.models import Choice, Question
Question.objects.all()
from django.utils import timezone
q = Question(question_text=“What’re new?”, pub_date=timezone.now())
q.save()
q.id
q.pub_date
q.question_text=“What’s up?”
q.save()
Question.objects.all()
polls/models.py
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
给模型增加 str() 方法是很重要的,这不仅仅能给你在命令行里使用带来方便,Django 自动生成的 admin 里也使用这个方法来表示对象。
注意:这些都是常规的 Python方法。让我们添加一个自定义的方法,这只是为了演示:
polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
新加入的 import datetime 和 from django.utils import timezone 分别导入了 Python 的标准 datetime 模块和 Django 中和时区相关的 django.utils.timezone 工具模块。
保存文件然后通过 python manage.py shell 命令再次打开 Python 交互式命令行:
from polls.models import Choice, Question
Question.objects.all()
Question.objects.fliter(id=1)
Question.objects.filter(question_text__startswith=“What”)from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)Question.objects.get(pk=1)
q = Question.objects.get(pk=1)
q.was_published_recently()q = Question.objects.get(pk=1)
q.choice_set.all()
q.choice_set.create(choice_text=‘Not much’, votes=0)
q.choice_set.create(choice_text=‘The sky’, votes=0)
c = q.choice_set.create(choice_text=‘Just hacking again’, votes=0)
c.question
q.choice_set.all()
q.choice_set.count()Choice.objects.filter(question__pub_date__year=current_year)
c = q.choice_set.filter(choice_text__startswith=‘Just hacking’)
c.delete()
介绍django管理页面
- 创建一个管理员账户
python manage.py createsuperuser
username: admin
Email address: admin@example.com
password: admin
password(again): admin
superuser create successfully.
- 启动开发服务器
python manage.py runserver
打开浏览器,转到你本地域名的 “/admin/” 目录, – 比如 “http://127.0.0.1:8000/admin/” 。你应该会看见管理员登录界面:
- 进入管理站点页面
现在,试着使用你在上一步中创建的超级用户来登录。然后你将会看到 Django 管理页面的索引页:
你将会看到几种可编辑的内容:组和用户。它们是由 django.contrib.auth 提供的,这是 Django 开发的认证框架。 - 向管理页面中加入投票应用
只需要做一件事:我们得告诉管理页面,问题 Question 对象需要被管理。打开 polls/admin.py 文件,把它编辑成下面这样:
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
- 体验便捷的管理功能
现在我们向管理页面注册了问题 Question 类。Django 知道它应该被显示在索引页里:
点击 “Questions” 。现在看到是问题 “Questions” 对象的列表 “change list” 。这个界面会显示所有数据库里的问题 Question 对象,你可以选择一个来修改。这里现在有我们在上一部分中创建的 “What’s up?” 问题。
点击 “What’s up?” 来编辑这个问题(Question)对象:
页面的底部提供了几个选项:
- 保存(Save) - 保存改变,然后返回对象列表。
- 保存并继续编辑(Save and continue editing) - 保存改变,然后重新载入当前对象的修改界面。
- 保存并新增(Save and add another) - 保存改变,然后添加一个新的空对象并载入修改界面。
- 删除(Delete) - 显示一个确认删除页面。
通过点击 “今天(Today)” 和 “现在(Now)” 按钮改变 “发布日期(Date Published)”。然后点击 “保存并继续编辑(Save and add another)”按钮。然后点击右上角的 “历史(History)”按钮。你会看到一个列出了所有通过 Django 管理页面对当前对象进行的改变的页面,其中列出了时间戳和进行修改操作的用户名: