python 2.7
Django 1.9.2
安装Django
pip install Django==1.9.2
django-admin
django-admin 是安装好Django组件后在当前目录中生成 Django项目 的管理工具
创建项目
django-admin startproject 项目名称
建立一个名叫 djangosite 的开发项目
django-admin startproject jdangosite
默认生成文件如下:
文件名 | 描述 |
---|---|
manage.py | 是Django用于管理本项目的命令行工具,之后进行站点运行、数据库自动生成、静态文件收集等都要通过该文件完成 |
djangosite目录 | 包含了本项目的实际文件,同时因为其中包含__init__.py文件,所以该目录也是一个Python包 |
_init_.py | 告诉python该目录是一个Python包 |
settings.py | Django的项目配置文件。 默认时,在其中定义了该项目引用的Django组件、Django项目名等。在之后的开发中,还需要在其中配置数据库参数、导入的其他python包等信息 |
urls.py | 维护项目URL路由映射,即定义客户端访问的URL由哪一个Python模块解释并提供反馈。 在默认情况下,其中只定义了"/admin"即管理员站点的解释器 |
wsgi.py | 定义WSGI的接口信息,用于与其他Web服务器集成,一般本文件在生成后无须改动 |
建立应用
python manage.py startapp 应用名称
进入项目文件目录
python manage.py startapp app
文件名 | 描述 |
---|---|
__init__.py | 该文件的存在使得app成为一个python包 |
admin.py | 管理站点模型的声明文件,默认为空 |
apps.py | 应用信息定义文件。 在其中生成了类AppConfig,该类用于定义应用名等Meta数据 |
migrations包 | 用于在之后定义引用迁移功能 |
models.py | 添加模型层数据类的文件 |
test.py | 测试代码文件 |
views.py | 定义URL响应映射 |
app/views.py
from django.http import HttpResponse
# Create your views here.
# 建立一个路由响应函数
# 返回一条被HttpResponse()封装的Welcome信息
def welcome(request):
return HttpResponse("<h1>Welcome to my tiny twitter</h1>")
app/urls.py
没有新建
from django.conf.urls import url # url函数,Django的所有路由映射由该函数生成
from . import views
# 该列表保存所有由url()函数生成的路由映射
urlpatterns = [
url(r'',views.welcome),
]
djangosite/urls.py
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include #新增,声明对应用app中urls.py文件的引用
urlpatterns = [
url(r'^app/',include('app.urls')), #第一个参数用正则表达式来表达URL路由,^app/ 表示所有以app开头的路由
url(r'^admin/', admin.site.urls),
]
运行访问
python manage.py runserver 127.0.0.1:8001
补充
如果运行python manage.py runserver 0.0.0.0:8000
,Django会以为是公网来访问它,而实际上我是在本地访问,所以会访问失败!
模型类
配置项目 INSTALLED_APPS
要在 djangosite/settings.py
中告诉 Django 需要安装应用app中的模型
INSTALLED_APPS = [
'app.apps.AppConfig', #新增,声明的是djangosite/app/apps.py中自动生成的AppConfig类
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
模型定义
在 app/models.py
中新建模型类 Moment 用来定义信息发布表
# -*- coding: utf-8 -*-
#新建模型类 Moment 用来定义信息发布表
from __future__ import unicode_literals
from django.db import model
# Create your models here.
# 定义子类
class Moment(models.Model):
content = models.CharField(max_length = 300) #保存消息的内容
user_name = models.CharField(max_length = 20) #保存发布人的名字
kind = models.CharField(max_length = 20) #保存消息的类型
生成数据移值文件(makemigrations)
所谓生成数据移值文件(makemigrations),是指将 app/models.py
中定义的数据表转换成数据库生成脚本的过程,该过程通过命工具 manage.py
完成
终端:
python manage.py makemigrations app
输出 app/migrations/0001_initial.py
文件,
是数据库生成的中间文件,通过它也可以知道当前的数据库版本
在 makemigrations
的过程中,Django会对比 app/models.py
中的模型与已有数据库之间的差异,如果没有差异则不会做任何工作,执行结果如下:
如果 app/models.py
中文件内容修改了,则在下一次 makemigrations
的时候将会将修改的内容同步到数据库中
比如:将 app/models.py
中Moment 类的字段从长度200修改为300后,再次执行
输出 app/migrations/0002_auto_20190801_1431.py
文件
移值到数据库
使用 manage.py
的 migrate
命令,使makemigrations 生成的中间移值文件生效、修改真实的数据库,进行同步
python manage.py migrate
表单视图
定义表单视图
在app/forms.py
中定义表单类
# -*- coding: utf-8 -*
from django.forms import ModelForm #该类是所有Django表单类的基类
from app.models import Moment #引入本项目 app/models.py 中 Moment类,以便后续的表单类中关联 此类
class MomentForm(ModelForm): #定义表单类
class Meta: #定义子类 Meta
#声明与本表单关联的模型类及其字段
model = Moment
fields = '__all__' #将所有模型类中的字段导入表单类中
修改模型类
修改 app/models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# 新增元祖用于设置消息类型枚举项
KIND_CHOICES = (
('Python技术','Python技术'),
('数据库技术','数据库技术'),
('经济学','经济学'),
('文体资讯','文体资讯'),
('个人心情','个人心情'),
('其他','其他'),
)
# Create your models here.
#新建模型类 Moment 用来定义信息发布表
class Moment(models.Model):
content = models.CharField(max_length = 300) #保存消息的内容
user_name = models.CharField(max_length = 20,default = '匿名') #保存发布人的名字
kind = models.CharField(max_length = 2, choices = KIND_CHOICES,default = KIND_CHOICES[0]) #保存消息的类
因为 Models 进行了修改,需要重新更新数据库定义,命令如下:
python manage.py makemigrations app
python manage.py migrate
输出 app/migrations/0003_auto_20190801_1643.py
开发模板文件
新建 app/templates
目录
新建 app/templates/moments_input.html
<!DOCTYPE html>
<html>
<head>
<title>消息录入页面</title>
</head>
<body>
<form action="?" method="post">
<fieldset>
<legend>请输入并提交</legend>
{{ form.as_p }}
<input type="submit" value="submit" />
</fieldset>
</form>
</body>
</html>
开发视图
在 app/views.py
# -*- coding: utf-8 -*-
import os
from django.http import HttpResponse
from app.forms import MomentForm
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.shortcuts import render
# 建立一个路由响应函数
# 返回一条被HttpResponse()封装的Welcome信息
def welcome(request):
return HttpResponse("<h1>Welcome to my tiny twitter</h1>")
def moments_input(request): #该函数定义两种访问方式的不同代理
if request.method == 'POST':
form = MomentForm(request.POST)
if form.is_valid():
moment = form.save()
moment.save()
return HttpResponseRedirect(reverse("app.views.welcome"))
else:
form = MomentForm()
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
return render(
request,
os.path.join(PROJECT_ROOT, 'app/templates', 'moments_input.html'),
{'form': form} # 将form作为参数传给模板,这样在模板文件中才能访问该 MomentForm 的实例
)
如果是用户的Post表单提交,则保存moment对象,并重定向到欢迎页面
如果是普通访问,则返回 moments_input.html
模板渲染结果作为 HTTP Response.
增加视图函数的映射路径
在 app/urls.py
中增加视图函数的映射路径
# 该列表保存所有由url()函数生成的路由映射
urlpatterns = [
url(r'moments_input',views.moments_input), #新增
url(r'',views.welcome),
]
运行并访问
python manage.py runserver 127.0.0.1:8001