Django篇(一)

  • 2019 年 10 月 6 日
  • 筆記

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 %}

即可。