Python之Django简介并快速练手
Django模式
首先Django是遵循MVC模式的。
M:Model,模型,与数据库进行交互
V:View,视图 html页面
C:Controller,控制器,接收请求,处理,返回数据,与视图进行交互
MVC中重要的思想就是解耦,各自干自己的事情。
简单整理一下思路:
比如一个登陆网页(也就是视图),点击登陆的时候,将账号和密码发送到MVC框架中的控制器(Controller),我们从控制器中进行处理,需要去查询数据库,但是这里不会直接去操作数据库,我们通过Model去进行操作数据库,回来也一样的。
在Django中,Django把控制器变成了Template,其实是一样的,就是名字不一样了,他把自己的模式叫做MVT。
不同的是:V变成了和MVC中C的功能相同,T和MVC中的V功能相同。
虽然他自己叫做MVT,本质还是遵循的MVC。
安装虚拟环境
安装一个和python一样的虚拟环境,使这个项目用到的模块与其他项目无关。
首先需要安装模块:
pip3 install virtualenv
上面操作密令比较复杂,安装一个扩展包:
pip3 install virtualenvwrapper-win
这时我们创建一个虚拟环境都是在C盘,我们给他换个路径。
添加环境变量:
此电脑->属性->高级->环境变量->在系统变量点击添加,变量名写WORKON_HOME,变量值写一个路径,(你创建虚拟环境想放的地方)
创建虚拟环境命令:mkvirtualenv 名字
如果你安装了python3和python2 用-p指定用哪个版本。
退出虚拟环境:deactivate
进入一个虚拟环境:workon 名字
查看自己创建了那些虚拟环境 workon
删除一个虚拟环境:rmvirtualenv 名字
创建这个虚拟环境后,你安装的包都是在你设定的文件夹下。并且创建的命令都是一样的。
创建一个项目
1、创建虚拟环境:
我们创建一个虚拟环境名字为djangostudy:mkvirtualenv djangostudy
2、安装Django框架
安装Django框架(在虚拟环境中使用pip):pip install django==1.8.2(==表示指定本版,不加也可以)
查看我们虚拟环境安装了上面模块:pip list。
3、创建一个项目
在创建项目前我们创建一个文件夹来放我们的项目:md 文件夹名字
我就创建一个xuexi的目录了。执行创建文件夹的密令的时候,要切换到虚拟换件文件夹下。
创建了xuexi后,我们cd xuexi到这个文件夹下。
创建一个项目:django-admin startproject 项目名字
我的项目名字就写test1。
4、目录结构
可以看到在xuexi下看到:
test1
__init__ 说明 test1 是一个python包
settings.py 配置文件
urls.py 路由配置
wsgi.py (wsgi协议)服务器和Django交互入口
manage.py 管理文件
5、创建一个应用
首先切换目录到test1中,cd test1。
一个模块对应一个应用,创建命令:python manage.py startapp 应用名
我这里写student
进入你的刚刚创建的应用你可以看到:
migrations
__init__ 说明migrations是一个包
__init__ 说明你的应用是一个包
admin.py 与网站后台管理相关
models.py 模型
tests.py 测试代码文件
views.py 视图函数
6、将应用和项目联系起来
需要修改配置文件,为了方面修改pycharm打开。
6.1、打开配置文件settings.py.
6.2、找到INSTALLED_APPS,把我们的英名名字写进去。我写上(有个逗号):'student',
7、运行项目
在tese1下执行命令:python manage.py runserver
他会告诉你在浏览器中输入127.0.0.1:8000/来访问。
当我们访问出现:
说明我们已经把项目运行起来了。
ORM框架
意思就是对象关系映射。
Django中内置ORM框架。运用这个框架让我们在操作数据库的时候更简单。
不用再写一些简单的Sql语句,通过创建一个类,来一一对应数据库中表的字段。
通过操作类来操作数据库中的表。所以在Models中就写和数据库中表,字段一样的类。
同时,他也可以根据你创建的类,来给你创建数据库中的表。
Models
我们在Models.py中写上:
# 类名字就是表名 ,继承models.Model表示是一个模型
class stuinfo(models.Model):
# 姓名 CharField(max_length=20) 表示varchar(20)
stuname = models.CharField(max_length=20)
# 生日 DateField日期类型
bri_date = models.DateField()
id主键不用我们写,他会自动生成
其他类型:
BooleanField(default=False) # bool类型,default默认值
ForeignKey('表名') # 设置外键 生成表的时候格式是 字段名_id ,赋值需要直接给对象。
如果我想让他生成一个表:
分为两步:先生成迁移文件,利用迁移文件再生成表
1、生成迁移文件
执行命令:python manage.py makemigrations
这个文件会放在migrations目录下
2、利用迁移文件再生成表
执行命令:python manage.py migrate
就会生成一个数据库,当然不是mysql数据库,在Django中如果不设置数据库用什么,会默认使用sqlite3数据库。这里不多说。
通过Models去操作表:
导入模块
from student.models import stuinfo
# 这里有日期,就导入一下日期模块
from datetime import date
# 添加一条数据:
s = stuinfo()
s.stuname = '张三'
s.bri_date = dete('2000','1','1')
s.save()
# 查询一条数据 找到id = 1的数据
s1 = student.objects.get(id = 1)
# 查询所有
s2 = student.objects.all()
# 显示数据
s1.stuname
s1.bri_date
# 修改
s1.stuname = '123'
s1.save()
# 删除
s1.delete()
多表联查
我们再在Models中添加一个类:
class person(models.Model):
# name
name = models.CharField(max_length=20)
# 外键
sid = models.ForeignKey('stuinfo')
多表联查有个外键,我们通过外键来查询
通过第一张表查询第二张表
s1 = student.objects.get(id = 1)
# 这样就查询到 nid = 1 的person的表了,在表名后加_set
s1.person_set.all()
通过第二张表查询第一张表
p1 = person.objects.get(id = 1)
p1.student
p1.student.stuname # 查询到stuname值
添加第二张表
s1 = student.objects.get(id = 1)
p2 = person()
p2.name = '小花'
# 外键需要赋值一个对象
p2.sid = s1
# 查询外键值
赋值是一个对象,那我们怎么查询到id值?
p3 = person.objects.get(id = 1)
# 这样才能查询到id值,在字典名后加_id
p3.nid_id
后台管理(admin)
Django给我们提供了很快生成后台的管理页面。
1、修改成中文页面
修改setting文件,找到LANGUAGE_CODE='en-us'
把他修改成:LANGUAGE_CODE='zh-hans'
2、中国时间
找到TIME_ZONE = 'UTC'修改成
TIME_ZONE = 'Asia/Shanghai'
3、创建管理员账户
执行命令:python manage.py createsuperuser
会提示输入用户名,邮箱(可以随意写)和密码。自己设置一个就好了
4、运行项目
运行命令:python manage.py runserver
5、登陆管理员页面
在浏览器中输入127.0.0.1:8000/admin ,就会进入管理员页面,登陆就好了。
6、注册模型类
在admin.py中注册模型类,来帮助我们生成对应的管理页面。
对我们的stuinfo表进入注册。
在admin.py中添加:
from student.models import stuinfo
admin.site.register(stuinfo)
这样就完成了对stuinfo表的注册。
接下来刷新我们的浏览器的管理页面。
就会多出一个队stuinfo表的管理。
我们可以在里面对stuinfo表操作,添加数据。
保存之后会显示:
我们看到显示的是一个英文,我想显示我的名字怎么办?
这个stuinfo object 其实是我们str(stuinfo)将一个对象转化为字符串的结果,
所以我们只需要在Models中的stuinfo中重写__str__方法即可。
def __str__(self):
return self.stuname
就会变成:
在这个管理页可以进行添加。删除,修改,查询的操作。
自定义管理页面
在admin.py中创建自定义管理的类
注意:list_display这个名字只能写这个名字。
我们的管理页面就会变成:
视图views
实现浏览器访问127.0.0.1:8080/index,显示:我是index页。
在视图中写:
# 导入模块
from django.http import HttpResponse
定义index方法,必须要有参数,(用于接收参数)
def index(request):
return HttpResponse('我是index页')
在student目录下创建一个urls.py写上:
from django.conf.urls import url
from student import views
# 建立与视图的对应关系,urlpatterns不要变
# 第一个是正则,匹配到返回的页面
urlpatterns = [
url(r'^index$', views.index),
]
修改test1问价下的urls.py:
修改urlpatterns成:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('student.urls')), # 让其路由支持student下的urls
]
即可。
整理一下思路,浏览器输入127.0.0.1:8080/index,服务器会把index传递到test1的url,匹配正则,匹配带第二个匹配就会去student下的urls中继续匹配,来完成方法的映射。
模板
1、创建一个文templates文件夹
2、在配置文件(setting.py)中设置网站模板的目录
在setting.py中找到:TEMPLATES的列表,
把DIRS修改成:
'DIRS':[os.path.join(BASE_DIR,'templates')]
# os.path.join()路径拼接,BASE_DIR项目的相对路径。
3、在templates下创建一个stuinfo文件夹,再在stuinfo文件夹下创建一个html文件,写上:
4、在views中返回这个页面
# 加载模板,相当于读取该文件
loader.get_template('stuinfo/index.html')
# 给模板文件数据
# 第一个参数为request,第二个为字典,暂时没有数据传过去,为空
context = RequestContext(request, {})
# 把上面两个结合生成一个html
ret_html = temp.render(context)
# 返回给浏览器
return HttpResponse(ret_html)
现在访问127.0.0.1:8000/index就会返回这是一个模板文件。
由上面我们得知:我们访问不同的页面在views中只是 模板不同,参数不同。
我们可以自己写一个方法来方便我们的操作。
这样写了之后,我们依然可以访问,但是这样的代码不许需要我们来写,在Django中已经封装好了。
我们直接写成:
就可以达到和我们之前一样的效果。
4、如何使用views中的参数字典?
例如我们返回值写上:
def index(request):
# 调用上面的方法即可
return render(request, 'stuinfo/index.html',{'context':'我是传递过来的参数'})
在index.html中接收:
# 两个花括号,中间直接写变量名
{{ context}}
这样我们的数据就传递过去了。
在index.html中使用for循环:
我们传递一个列表过去
def index(request):
# 调用上面的方法即可
return render(request, 'stuinfo/index.html',{'context':'我是传递过来的参数','list':list(range(10))})
在index.html中便利循环出来
# 开始for循环
{% for i in list%}
{{i}}
# 结数for循环
{% endfor %}
即可。