pip install Django==1.8.2
django-admin startproject 项目名
cd CTTIC
python manage.py startapp 应用名
建立应用和项目之间的联系,需要对应用进行注册
在CTTIC/settings.py
进行修改
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app', #新增,为应用名
)
python manage.py runserver
在app/models.py
中设计模型类
id | btitle | bpub_date |
---|---|---|
#-*- coding:utf-8 -*-
from django.db import models
# Create your models here.
#图书类
class BookInfo(models.Model):
'''图书模型类'''
#id 自动生成
#图书名称
btitle = models.CharField(max_length=20)
#出版日期
bpub_date = models.DateField()
python manage.py makemigrations
python manage.py migrate
默认使用 sqlite3 数据库
在CTTIC/settings.py
查看配置信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
pip install pymysql
使用的数据库需要提前创建出来
在CTTIC/settings.py
中修改
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'test', #使用数据库的名字,数据库需要手动创建
'USER': 'root', #链接mysql的用户名
'PASSWORD': 'xxxxxxxxxxx', #用户对应的密码
'HOST': 'localhost', #指定数据库IP
'PORT': 3306, #端口
}
}
在CTTIC/CTTIC/__init__.py
去驱动模块进行配置
import pymysql
pymysql.install_as_MySQLdb()
服务器启动测试代码是否跑通
python manage.py runserver
重新执行迁移文件生成表
python manage.py makemigrations
python manage.py migrate
python manage.py shell
from app.models import BookInfo #导入类
b = BookInfo() #创建类的对象
b.btitle = 'Python编程从入门到精通' #给对象增加实例属性
from datetime import date
b.bpub_date = date(2016,7,1)
b.save() #数据添加
result = BookInfo.objects.get(id=1)
一对多关系表,例如:一本书中有多个英雄
在 app/models.py
编写
#-*- coding:utf-8 -*-
from django.db import models
# Create your models here.
#图书类
class BookInfo(models.Model):
'''图书模型类'''
#id 自动生成
#图书名称
btitle = models.CharField(max_length=20)
#出版日期
bpub_date = models.DateField()
#英雄人物类
class HeroInfo(models.Model):
#英雄名 hname
hname = models.CharField(max_length=20)
# 性别 hgender,并指定默认值
hgender = models.BooleanField(default=False)
# 备注 hcomment
hcomment = models.CharField(max_length=128)
#关系属性,建立图书类和英雄人物类之间的一对多关系
hbook = models.ForeignKey('BookInfo')
执行迁移文件生成表
python manage.py makemigrations
python manage.py migrate
from app.models import BookInfo,HeroInfo
b = BookInfo()
b.btitle = '天龙八部'
from datetime import date
b.bpub_date = date(1990,1,1)
b.save()
h = HeroInfo()
h.hname = '段誉'
h.hgender = False
h.hcomment = '六脉神剑'
h.hbook = b
h.save()
h2 = HeroInfo()
h2.hname = '乔峰'
h2.hcomment = '降龙十八掌'
h2.hbook = b
h2.save()
BookInfo.objects.all()
HeroInfo.objects.all()
h.hbook
result = HeroInfo.objects.get(id=3)
print(result.hname)
print(result.hgender)
print(result.hcomment)
print(result.hbook)
print(result.hbook.btitle)
b.heroinfo_set.all()
语言和时区的本地化
修改 CTTIC/CTTIC/settings.py
下的配置信息
#语言
LANGUAGE_CODE = 'zh-hans'
#时区
TIME_ZONE = 'Asia/Shanghai'
python manage.py createsuperuser
python manage.py runserver
让Django框架根据注册的模型类生成对应表管理页面
在CTTIC/app/admin.py
中注册模型类
from django.contrib import admin
from app.models import BookInfo
# Register your models here.
admin.site.register(BookInfo)
更改默认显示的字符串,修改 CTTIC/app/models.py
class BookInfo(models.Model):
'''图书模型类'''
#id 自动生成
#图书名称
btitle = models.CharField(max_length=20)
#出版日期
bpub_date = models.DateField()
def __str__(self):
# 返回书名
return self.btitle
修改 CTTIC/app/admin.py
#-*- coding:utf-8 -*-
from django.contrib import admin
from app.models import BookInfo,HeroInfo
# Register your models here.
# 自定义模型管理类
class BookInfoAdmin(admin.ModelAdmin):
'''图书模型管理类'''
list_display = ['id','btitle','bpub_date']
#注册模型类
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo)
Django 通过浏览器去请求一个页面时,使用试图函数来处理这个请求,视图函数处理之后,要给浏览器返回页面内容
在CTTIC/app/views.py
修改代码
#-*- coding:utf-8 -*-
from django.http import HttpResponse
# Create your views here.
# 访问 http://127.0.0.1:8000/index
def index(request):
return HttpResponse('老铁!没毛病')
在 CTTIC/CTTIC/urls.py
中添加
#-*- coding:utf-8 -*-
from django.conf.urls import include, url
from django.contrib import admin
# 项目的urls文件
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^',include('app.urls')), #新增app应用中urls路由配置项
]
建立地址与视图处理函数的对应
新建 CTTIC/app/urls.py
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^index',views.index), #建立 /index 与 视图index函数之间的关系
]
项目启动
python manage.py runserver
在CTTIC/app/views.py
修改代码
#-*- coding:utf-8 -*-
from django.http import HttpResponse
# Create your views here.
# 访问 http://127.0.0.1:8000/index
def index(request):
return HttpResponse('老铁!没毛病')
def index2(request):
return HttpResponse('Index2 页面')
在 CTTIC/CTTIC/urls.py
的代码不变
#-*- coding:utf-8 -*-
from django.conf.urls import include, url
from django.contrib import admin
# 项目的urls文件
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^',include('app.urls')), #新增app应用中urls路由配置项
]
添加 CTTIC/app/urls.py
路由,严格匹配
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^index$',views.index), #建立 /index 与 视图index函数之间的关系
url(r'^index2$',views.index2),
]
进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数
新增 CTTIC/app/urls.py
from django.conf.urls import url
from app import views
urlpatterns = [
url(r'^showarg(\d+)$',views.showarg_location), #捕获url参数:位置参数
url(r'showarg(?P\d+)$' ,views.showarg_key), #捕获url参数:关键字参数
]
CTTIC/app/views.py
中编辑视图函数
from django.http import HttpResponse
def showarg_location(request,bid):
return HttpResponse(bid)
def showarg_key(request,num):
return HttpResponse(num)
request
request 就是httpRequest类型的对象
request 包含浏览器请求的信息
在 CTTIC/CTTIC/settings.py
中设置模板目录位置
# 项目目录绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], #设置模板目录位置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
新建CTTIC/templates/app/index.html
文件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1>这是一个模板文件h1>
body>
html>
修改 CTTIC/app/views.py
中视图处理函数
#-*- coding:utf-8 -*-
from django.http import HttpResponse
from django.template import loader,RequestContext
# Create your views here.
# 访问 http://127.0.0.1:8000/index
def index(request):
# 加载模板文件
temp = loader.get_template('app/index.html')
# 定义模板上下文,给模板文件传数据
context = RequestContext(request,{})
# 模板渲染 : 产生标准的HTML内容
res_html = temp.render(context)
# 返回给浏览器
return HttpResponse(res_html)
from django.http import HttpResponse
from django.template import loader,RequestContext
# Create your views here.
# 访问 http://127.0.0.1:8000/index
def my_render(request,template_path,context_dict={}):
temp = loader.get_template(template_path)
# 定义模板上下文,给模板文件传数据
context = RequestContext(request, context_dict)
# 模板渲染 : 产生标准的HTML内容
res_html = temp.render(context)
# 返回给浏览器
return HttpResponse(res_html)
def index(request):
return my_render(request,'app/index.html')
Django 提供的render()
函数 实现了上述简化的功能
from django.shortcuts import render
def index(request):
return render(request,'app/index.html')
CTTIC/templates/app/index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1>这是一个模板文件h1>
使用模板变量: <br/> {{ content }} <br/>
使用列表:<br/> {{ list }} <br/>
使用 for 循环: <br/>
<ul>
{% for i in list %}
<li>{{ i }}li>
{% endfor %}
ul>
body>
html>
CTTIC/app/views.py
from django.shortcuts import render
def index(request):
context_dict = {
'content':'hello world',
'list':list(range(1,10)),
}
return render(request,'app/index.html',context_dict)
from django.shortcuts import render
from app.models import BookInfo
def show_books(request):
'''显示数据库图书信息'''
# 通过模型查找数据库信息
books = BookInfo.objects.all()
context = {
'books':books
}
return render(request,'app/show_books.html',context)
CTTIC/CTTIC/urls.py
配置项目路由
from django.conf.urls import include, url
from django.contrib import admin
# 项目的urls文件
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^',include('app.urls')), #新增app应用中urls路由配置项
]
CTTIC/app/urls.py
配置应用路由
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^index$',views.index), #建立 /index 与 视图index函数之间的关系
url(r'^index2$',views.index2),
url(r'^books$',views.show_books), #新增
]
新建CTTIC/templates/app/show_books.html
页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示图书title>
head>
<body>
图书信息如下<br/>
<ur>
{% for book in books %}
<li>{{ book.btitle }}li>
{% endfor %}
ur>
body>
html>
点击页面跳转到另一个页面,并显示与之相关的信息
CTTIC/templates/app/show_books.html
<body>
图书信息如下<br/>
<ur>
{% for book in books %}
<li><a href="/books/{{ book.id }}">{{ book.btitle }}a>li>
{% endfor %}
ur>
body>
from django.shortcuts import render
from app.models import BookInfo
def detail(request,bid):
'''查询图书关联的表的英雄信息'''
#根据bid查询图书信息
book = BookInfo.objects.get(id=bid)
#查询和bid图书关联的英雄信息
heros = book.heroinfo_set.all()
# 使用模板将数据展示
context = {
'book':book,
'heros':heros,
}
return render(request,'app/detail.html',context)
CTTIC/app/urls.py
配置应用路由
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^index$',views.index), #建立 /index 与 视图index函数之间的关系
url(r'^index2$',views.index2),
url(r'^books$',views.show_books), #显示图书信息
url(r'^books/(\d+)$',views.detail), #显示英雄信息
]
新建 CTTIC/templates/app/details.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示管理的英雄信息title>
head>
<body>
<h1>{{ book.btitle }}h1>
英雄信息如下:<br>
<ul>
{% for hero in heros %}
<li>{{ hero.hname }}--{{ hero.hcomment }}li>
{% empty %}
<li>没有英雄信息li>
{% endfor %}
ul>
body>
html>
丰富一下数据表的结构内容,并添加一些模拟数据
CTTIC/app/models.py
#-*- coding:utf-8 -*-
from django.db import models
# Create your models here.
#图书类
class BookInfo(models.Model):
'''图书模型类'''
#id 自动生成
#图书名称
btitle = models.CharField(max_length=20)
#出版日期
bpub_date = models.DateField()
#阅读量
bread = models.IntegerField(default=0)
#评论量
bcomment = models.IntegerField(default=0)
#删除标记
isDelete = models.BooleanField(default=False)
def __str__(self):
# 返回书名
return self.btitle
#英雄人物类
class HeroInfo(models.Model):
#英雄名 hname
hname = models.CharField(max_length=20)
# 性别 hgender,并指定默认值
hgender = models.BooleanField(default=False)
# 备注 hcomment
hcomment = models.CharField(max_length=128)
#关系属性,建立图书类和英雄人物类之间的一对多关系
hbook = models.ForeignKey('BookInfo')
def __str__(self):
return self.hname
python manage.py makemigrations
python manage.py migrate
通过SQL添加测试数据
INSERT INTO `app_bookinfo` (`id`, `btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES (5, '射雕英雄传', '1980-5-1', 12, 34, 0);
INSERT INTO `app_bookinfo` (`id`, `btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES (6, '天龙八部', '1986-7-24', 36, 40, 0);
INSERT INTO `app_bookinfo` (`id`, `btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES (7, '笑傲江湖', '1995-12-24', 20, 80, 0);
INSERT INTO `app_bookinfo` (`id`, `btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES (8, '雪山飞狐', '1987-11-11', 58, 24, 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (6, '郭靖', 1, 5, '降龙十八掌', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (7, '黄蓉', 0, 5, '打狗棒法', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (8, '黄药师', 1, 5, '弹指神功', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (9, '欧阳锋', 1, 5, '蛤蟆功', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (10, '梅超风', 0, 5, '九阴白骨爪', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (11, '乔峰', 1, 6, '降龙十八掌', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (12, '段誉', 1, 6, '六脉神剑', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (13, '虚竹', 1, 6, '天山六阳掌', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (14, '王语嫣', 0, 6, '神仙姐姐', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (15, '令狐冲', 1, 7, '独孤九剑', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (16, '任盈盈', 0, 7, '弹琴', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (17, '岳不群', 1, 7, '华山剑法', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (18, '东方不败', 1, 7, '葵花宝典', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (19, '胡斐', 1, 8, '胡家刀法', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (20, '苗若兰', 0, 8, '黄衣', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (21, '程灵素', 0, 8, '医术', 0);
INSERT INTO `app_heroinfo` (`id`, `hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES (22, '袁紫衣', 0, 8, '六合掌', 0);
CTTIC/templates/app/show_books.html
<body>
<a href="/create">新增a> <br/>
图书信息如下<br/>
<ur>
{% for book in books %}
<li><a href="/books/{{ book.id }}">{{ book.btitle }}a>li>
{% endfor %}
ur>
body>
CTTIC/app/views.py
添加数据的视图函数
from django.http import HttpResponseRedirect
from app.models import BookInfo
from datetime import date
def create(request):
'''图书表新增数据'''
# 新建 BookInfo对象
b = BookInfo()
b.btitle = '流星蝴蝶剑'
b.bpub_date = date(1990,1,1)
b.bread = 20
b.bcomment = 30
# 数据保存
b.save()
# 页面重定向
return HttpResponseRedirect('/books')
配置应用路由CTTIC/app/urls.py
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^books$',views.show_books), #显示图书信息
url(r'^books/(\d+)$',views.detail), #显示英雄信息
url(r'create$',views.create), # 新增数据
]
编辑 CTTIC/templates/app/show_books.html
<body>
<a href="/create">新增a> <br/>
图书信息如下<br/>
<ur>
{% for book in books %}
<li><a href="/books/{{ book.id }}">{{ book.btitle }}a> --<a href="/delete{{ book.id }}">删除a> li>
{% endfor %}
ur>
body>
CTTIC/app/views.py
删除数据的视图函数
from django.http import HttpResponseRedirect
from app.models import BookInfo
def delete(request,bid):
'''删除数据'''
#通过bid获取图书对象
book = BookInfo.objects.get(id=bid)
#删除
book.delete()
#页面重定向
return HttpResponseRedirect('/books')
重定向的另一种写法
from django.shortcuts import redirect
def delete(request,bid):
'''删除数据'''
......
return redirect('/books')
配置应用路由CTTIC/app/urls.py
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
# 通过url函数设置url配置项
url(r'^books$',views.show_books), #显示图书信息
url(r'^books/(\d+)$',views.detail), #显示英雄信息
url(r'create$',views.create), # 新增数据
url(r'delete(\d+)$',views.delete), # 删除数据
]
在项目开发期间,代码未完成,访问路由地址,返回指定的404页面
修改 CTTIC/CTTIC/settings.py
配置
# DEBUG = True
# ALLOWED_HOSTS = []
DEBUG = False
ALLOWED_HOSTS = ['*'] # 星代表允许所有 ip 访问
关闭调试模式之后,默认会显示一个标准的错误页面,如果要显示自定义的页面,需要在 templates 目录下自定义一个 404.html
页面(url没有配置或者配置错误)和500.html
服务器端错误(视图函数出错)
新建 CTTIC/templates/404.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404错误页面title>
head>
<body>
<h1>页面正在开发h1>
{{ request_path }}
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500错误title>
head>
<body>
<h1>服务器错误,可能视图函数报错误h1>
body>
html>
浏览器 输入 127.0.0.1:8000/login
跳转登录页面
新建 CTTIC/templates/app/login.html
GET
表单 : 提交的参数在URL中
POST
表单: 提交的参数在请求体中
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面title>
head>
<body>
<form method="post" action="/login_check">
用户名: <input type="text" name="username"><br/>
密码: <input type="password" name="password"><br/>
<input type="submit" value="登录">
form>
body>
html>
添加视图函数 CTTIC/app/views.py
def login(request):
'''显示登录页面'''
return render(request,'app/login.html')
配置路由 CTTIC/app/urls.py
#-*- coding:utf-8 -*-
from django.conf.urls import url
from app import views
urlpatterns = [
url(r'^login$',views.login), #显示登录页面
]
使用 浏览器 【F12】模拟输入账号和密码,浏览器的变化
网页中 GET
请求效果
<form method="get" action="/login_check">
form>
配置路由,并编写视图函数 接收提交的表单数据
配置路由 CTTIC/app/urls.py
添加视图函数 CTTIC/app/views.py
接受数据并验证