MVC

  • 大部分开发语言中都有MVC框架
  • MVC框架的核心思想是:解耦
  • 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
  • m表示model,主要用于对数据库层的封装
  • v表示view,用于向用户展示结果
  • c表示controller,是核心,用于处理请求、获取数据、返回结果

MVT

  • Django是一款python的web开发框架
  • 与MVC有所不同,属于MVT框架
  • m表示model,负责与数据库交互
  • v表示view,是核心,负责接收请求、获取数据、返回结果
  • t表示template,负责呈现内容到浏览器

创建虚拟环境

  • 创建:mkvirtualenv [虚拟环境名称]
  • 删除:rmvirtualenv [虚拟环境名称]
  • 进入:workon [虚拟环境名称]
  • 退出:deactivate
  • 所有的虚拟环境,都位于/home/.virtualenvs目录下
  • 进入虚拟环境前的提示:

进入虚拟环境后的提示

  • 查看当前的所有虚拟环境:workon [两次tab键]
  • 查看虚拟环境中已经安装的包
pip list
pip freeze

安装django

  • 建议安装1.8.2版本,这是一个稳定性高、使用广、文档多的版本
pip install django==1.8.2
  • 查看版本:进入python shell,运行如下代码
import django
django.get_version()
  • 说明:使用pip install django命令进行安装时,会自动删除旧版本,再安装新版本

创建项目

  • 命令django-admin startproject test1(test1为项目名称)
  • 进入test1目录,目录结构如下图:

目录说明

  • manage.py:一个命令行工具,可以使你用多种方式对Django项目进行交互
  • 内层的目录:项目的真正的Python包
  • _init _.py:一个空文件,它告诉Python这个目录应该被看做一个Python包
  • settings.py:项目的配置
  • urls.py:项目的URL声明
  • wsgi.py:项目与WSGI兼容的Web服务器入口

创建应用

  • 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
  • 创建应用的命令:
python manage.py startapp booktest
  • 应用的目录结构如下图

定义模型类

  • 有一个数据表,就有一个模型类与之对应
  • 打开models.py文件,定义模型类
  • 引入包from django.db import models
  • 模型类继承自models.Model类
  • 说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长
  • 当输出对象时,会调用对象的str方法

models.py

from django.db import models

'''
图书,一本图书可以有多个英雄,一个英雄对应一本图书
'''
class BookInfo(models.Model):
btitle=models.CharField(max_length=)
bpub_date=models.DateTimeField() def __str__(self):
return self.btitle '''
英雄
'''
class HeroInfo(models.Model):
hname=models.CharField(max_length=)
hgender=models.BooleanField()
hcontent=models.CharField(max_length=)
hbook=models.ForeignKey(BookInfo) def __str__(self):
return self.hname

  • 生成迁移文件:根据模型类生成sql语句
python manage.py makemigrations
  • 迁移文件被生成到应用的migrations目录

  • 执行迁移:执行sql语句生成数据表
python manage.py migrate

测试数据操作

  • 进入python shell,进行简单的模型API练习
python manage.py shell
  • 进入shell后提示如下:

引入需要的包:
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=,month=,day=)
b.save()
查找图书信息:
b=BookInfo.objects.get(pk=)
输出图书信息:
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()
有一个HeroInfo存在,必须要有一个BookInfo对象,提供了创建关联的数据:
h=b.heroinfo_set.create(htitle=u'黄蓉',hgender=False,hcontent=u'打狗棍法')
h

服务器

  • 运行如下命令可以开启服务器
python manage.py runserver ip:port
  • 可以不写ip,默认端口为8000
  • 这是一个纯python编写的轻量级web服务器,仅在开发阶段使用
  • 服务器成功启动后,提示如下信息

  • 默认端口是8000,可以修改端口
python manage.py runserver 
  • 打开浏览器,输入网址“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')”

自定义管理页面

  • Django提供了admin.ModelAdmin类
  • 通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
class QuestionAdmin(admin.ModelAdmin):
...
admin.site.register(Question, QuestionAdmin)
列表页属性
  • 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)

admin.py
from django.contrib import admin
from booktest.models import * #关联对象
class HeroInfoInline(admin.StackedInline):
model = HeroInfo
extra = #自定义管理页面
class BookInfoAdmin(admin.ModelAdmin):
#显示字段,可以点击列头进行排序
list_display = ['id','btitle','bpub_date']
list_filter=['btitle']
search_fields = ['btitle']
list_per_page =
fieldsets = [
('base',{'fields':['btitle']}),
('super',{'fields':['bpub_date']})
] # 关联对象
inlines = [HeroInfoInline] #注册模型
admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo)
 

布尔值的显示

  • 发布性别的显示不是一个直观的结果,可以使用方法进行封装
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']

视图

  • 在django中,视图对WEB请求进行回应
  • 视图接收reqeust对象作为第一个参数,包含了请求的信息
  • 视图就是一个Python函数,被定义在views.py中

views.py

from django.shortcuts import render

#引入请求和响应模块
from django.http import HttpRequest,HttpResponse #引入数据models模块
from booktest.models import *
#视图
def index(request):
# return HttpResponse("胡哥你好酷啊!") #通过字典传递数据
mList=BookInfo.objects.all()
context={'list':mList}
return render(request,'booktest/index.html',context) #id为路由中(\d+)正则分组中传递过来的参数
def show(request,id):
#根据id找到书籍列表
book=BookInfo.objects.get(pk=id)
#书籍和英雄通过外键forginkey对应,找到对应的英雄,heroinfo为models中的HeroInfo类
heroList=book.heroinfo_set.all()
context={'list':heroList}
return render(request,'booktest/show.html',context)
 
  • 定义完成视图后,需要配置urlconf,否则无法处理请求

URLconf

  • 在Django中,定义URLconf包括正则表达式、视图两部分
  • Django使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图
  • 注意:只匹配路径部分,即除去域名、参数后的字符串
  • 在test1/urls.py插入booktest,使主urlconf连接到booktest.urls模块

test11/urls.py

from django.conf.urls import url,include
from django.contrib import admin #项目总路由
urlpatterns = [
#r表示原始字符串,^表示以什么开头,$表示以什么结尾
url(r'^admin/', admin.site.urls), #views.index表示views模块下的index函数
# url(r'^index$',views.index), #引入应用路由,include为关键字
url(r'^', include('booktest.urls')),
]

  • 在booktest中的urls.py中添加urlconf
booktest/urls.py
from django.conf.urls import url

from booktest import views

urlpatterns =[
url(r'^$',views.index), #(\d+)加括号进行分组是为了视图函数中能够接收该参数
url(r'^(\d+)$',views.show),
]

模板

  • 模板是html页面,可以根据视图中传递的数据填充值
  • 创建模板的目录如下图:

  • 修改settings.py文件,设置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
  • 在模板中访问视图传递的数据
{{输出值,可以是变量,也可以是对象.属性}}
{%执行代码段%}

定义index.html模板

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用模板</title>
</head>
<body>
<h1>使用模板渲染</h1> <ul> {%for book in list %}
<li><a href="{{ book.id }}">{{ book.btitle }}</a></li>
{%endfor %}
</ul>
</body>
</html>

定义show.html模板

  • 在模板中访问对象成员时,都以属性的方式访问,即方法也不能加括号
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>展示页面</title>
</head>
<body> <ul>
{% for hero in list %} <li>{{ hero.hname }}</li>
{% endfor %}
</ul>
</body>
</html>

使用模板

  • 编辑views.py文件,在方法中调用模板
#id为路由中(\d+)正则分组中传递过来的参数
def show(request,id):
#根据id找到书籍列表
book=BookInfo.objects.get(pk=id)
#书籍和英雄通过外键forginkey对应,找到对应的英雄,heroinfo为models中的HeroInfo类
heroList=book.heroinfo_set.all()
context={'list':heroList}
return render(request,'booktest/show.html',context)

去除模板的硬编码

  • 在index.html模板中,超链接是硬编码的,此时的请求地址为“127.0.0.1/1/”
<a href="{{book.id}}">
  • 看如下情况:将urlconf中详细页改为如下,链接就找不到了
url(r'^book/([0-9]+)/$', views.detail),
  • 此时的请求地址应该为“127.0.0.1/book/1/”
  • 问题总结:如果在模板中地址硬编码,将来urlconf修改后,地址将失效
  • 解决:使用命名的url设置超链接
  • 修改test1/urls.py文件,在include中设置namespace
url(r'^admin/', include(admin.site.urls, namespace='booktest')),
  • 修改booktest/urls.py文件,设置name
url(r'^book/([0-9]+)/$', views.detail, name="detail"),
  • 修改index.html模板中的链接
<a href="{%url 'booktest:detail' book.id%}">

Render简写

  • Django提供了函数Render()简化视图调用模板、构造上下文
from django.shortcuts import render
from models import BookInfo def index(reqeust):
booklist = BookInfo.objects.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist}) def show(reqeust, id):
book = BookInfo.objects.get(pk=id)
return render(reqeust, 'booktest/show.html', {'book': book})

1.Django入门的更多相关文章

  1. 【django入门教程】Django的安装和入门

    很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. python学习笔记--Django入门四 管理站点

    上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...

  4. Django 入门

    Django 入门 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模型,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容 ...

  5. Django入门实践(三)

    Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...

  6. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  7. Django入门实践(一)

    Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...

  8. Django入门笔记

    Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...

  9. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

  10. 【Python全栈-后端开发】Django入门基础-2

    Django入门基础知识-2 一 .模版 一.模版的组成 HTML代码+逻辑控制代码 二.逻辑控制代码的组成 1  变量(使用双大括号来引用变量) {{var_name}} 2  标签(tag)的使用 ...

随机推荐

  1. socket 长连接

    实现: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 服务端: 由于客户端会定时(keepAliveDelay毫秒)发送 ...

  2. 买茶叶想到的哪个比较便宜 x1/y1 >x2/y2 x代表多少钱 y代表 多少克 无聊的试炼

    茶叶1 128元     200克 茶叶2  330元    160克 当然这个哪个便宜 一眼就知道了,这里不过抛砖引玉 128元    330元 200克    160克 我们把价钱用x表示 多少克 ...

  3. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  4. python输出格式对齐问题

    采用.format打印输出时,可以定义输出字符串的输出宽度,在 ':' 后传入一个整数, 可以保证该域至少有这么多的宽度. 用于美化表格时很有用. >>> table = {'Goo ...

  5. User_Agent大全

    'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Ver ...

  6. GUI的最终选择Tkinter模块初级篇

    一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...

  7. day10作业—(闭包迭代器递归)

    补充:一个星号的  打散和聚合 a, b , *c = [1,2, 1,4] print( a , b , *c) #1 2 1 4 print(a, b, c) #1 2 [1, 4] *c , = ...

  8. MySql常用命令集

    MySql 常用命令集 Mysql常用命令 show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop ...

  9. Codeforces 1093 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 GGG题手速慢了没有在比赛的时候码出来233,FFF题居然没想出来? 五道题滚粗. 先谈谈其他几道题. A题 传送门 不小心看错题 直接看奇 ...

  10. idea下启动tomcat时,打印的日志中文乱码

    idea2018.2+tomcat8+java8+win10 异常:将编码方式全都修改为UTF-8后,且tomcat的VM启动参数中配置了:-Dfile.encoding=UTF-8.导致控制台日志打 ...