第一天的学习:
1、Django框架的了解
2、虚拟环境的创建和使用
3、Django框架的创建和基础文件的作用
4、模型类的设计
5、通过模型类操作数据表中的记录
6、模型类中的关联对象与操作
7、后台管理
8、视图的实现
9、模板的创建和使用
框架与MVC有所不同,属于MVT框架
我的理解的话一个MVC框架的话正常的来说
C:控制器 来接收相应的客户端传进来的参数或者所要调用的方法 然后下发指令 到M\V
M:模型 来接收C传过来的方法 进行相关的数据库操作 然后再返回到C中
V:视图 通过M传到给C的相关数据 再通过相应的类似php中的smart再进行渲染 然后返回到客户端的浏览器上
而这里的MVT框架又是如下:
M:表示model,负责与数据库交互
V:表示view,是核心,负责接收请求、获取数据、返回结果
T:表示template,负责呈现内容到浏览器
1、安装命令:
pip install virtualenv
pip install virtualenvwrapper-win
2、创建环境:
mkvirtualenv 1-day # 创建虚拟环境
结果:
结果:
C:\Users\dell\Desktop\ALL\python\django>mkvirtualenv 1-day
C:\Users\dell\Envs is not a directory, creating
Using base prefix 'c:\\program files\\python36'
New python executable in C:\Users\dell\Envs\1-day\Scripts\python.exe
Installing setuptools, pip, wheel...
done.
再查看下当前环境下的安装包
pip list
3、退出的命令:deactivate
4、进入环境:
C:\Users\dell\Desktop\ALL\python\django>workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
1-day
C:\Users\dell\Desktop\ALL\python\django>workon 1-day
(1-day) C:\Users\dell\Desktop\ALL\python\django>
5、删除环境:
rmvirtualenv 环境名称
C:\Users\dell\Desktop\ALL\python\django>rmvirtualenv
Removes a virtualenv.
Usage: rmvirtualenv NAME
NAME the name of the virtualenv to remove
1、创建工程
django-admin startproject test1
结果:
(1-day) C:\Users\dell\Desktop\ALL\python\django>tree /f
卷 OS 的文件夹 PATH 列表
卷序列号为 6AEE-CCAD
C:.
│ 虚拟环境用法.txt
│
├─day1
└─test1
│ manage.py
│
└─test1
settings.py
urls.py
wsgi.py
__init__.py
目录说明:
manage.py
:一个命令行工具,可以使你用多种方式对Django项目进行交互
内层的目录:项目的真正的Python包
_init _.py
:一个空文件,它告诉Python这个目录应该被看做一个Python包
settings.py
:项目的配置
urls.py
:项目的URL声明、起到URL的路由的作用
wsgi.py
:项目与WSGI兼容的Web服务器入口
2、创建应用:
这里所谓的应用的理解:一个项目由许多应用组成
python manage.py startapp booktest
(1-day) C:\Users\dell\Desktop\ALL\python\django\test1\booktest>tree /f
卷 OS 的文件夹 PATH 列表
卷序列号为 6AEE-CCAD
C:.
│ admin.py #后台管理相关文件
│ models.py #写数据库项目的内容
│ tests.py #测试代码文件
│ views.py #接收请求 与M、T进行交互 返回应答
│ __init__.py #说明目录是一个python模块
│
└─migrations
__init__.py
这里如果我们需要让应用booktest
在项目之间test1
生成联系,我们还需要在settings.py
进行在注册应用操作。
运行项目
python manage.py runserver
模型类的设计:
首先在models.py
定义一个类BookInfo
# 图书类
class BookInfo(models.Model):#必须继承model.Model
'''图书模型类'''
btitle = models.CharField(max_length=20)
bpub_data = models.DateField()
这里需要注意的是:生成模型类的时候 Django中主键id会自动生成
模型类生成表:
1、生成迁移文件
(1-day) C:\Users\dell\Desktop\ALL\python\django\test1>python manage.py makemigrations
Migrations for 'booktest':
0001_initial.py:
- Create model BookInfo
2、执行迁移生成表:
(1-day) C:\Users\dell\Desktop\ALL\python\django\test1>python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: messages, staticfiles
Apply all migrations: booktest, auth, sessions, contenttypes, admin
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying booktest.0001_initial... OK
Applying sessions.0001_initial... OK
python manage.py migrate
根据迁移文件去生成表
生成表名的默认格式:
应用名_模型类(小写)
3、通过模型类来操作数据库(ORM)
在Django
中内嵌了ORM
框架(自己不懂 到时候还需要去学习下),有了ORM
框架我们可以直接通过在通过类生成的实例对象的操作来直接对数据表的中数据进行增删改查
ORM
的另外一个作用:根据设计的类生成数据库中的表
然后我们加入通过实例化类来进行操作:添加一条BookInfo类的记录
C:\Users\dell\Desktop\ALL\python\django\test1>python manage.py shell
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from booktest.models import BookInfo
>>> from datetime import date
>>> b = BookInfo()
>>> b.btitle = 'book'
>>> b.bpub_data = date(1999,1,1)
>>> b.save()
>>> b.btitle
'book'
查询相应的id的记录数据:
b2 = BookInfo.objects.get(id=1)
b2.btitle
>>>'book'
修改相应的id的记录数据:
>>> b2 = BookInfo.objects.get(id=1)
>>> b2.btitle
'book'
>>> b2.id
1
>>> b2.btitle = '小黄书'
>>> b2.save()#更新/保存操作
删除相应的id的记录数据:
>>> b2 = BookInfo.objects.get(id=1)
>>> b2 = delete()
>>>
1、BookInfo(一类)和HeroInfo(多类)之间需要产生关联,所以需要在HeroInfo中创建模型的时候需要创建好关系,书和英雄的关系是 一对多的关系 所以我们在创建好HeroInfo的模型类的时候 还需要创建与BookInfo之间的关系
正常的创建
class HeroInfo(models.Model):
hname = models.CharField(max_length=20) # 姓名
hgender = models.BooleanField(default=False)# 性别
hcomment = models.CharField(max_length=128)# 技能
还需要加上关系属性的字段:
hbook = models.ForeignKey('BookInfo')
然后再生成迁移文件、然后再生成迁移文件表
C:\Users\dell\Desktop\ALL\python\django\test1>python manage.py makemigrations
Migrations for 'booktest':
0002_heroinfo.py:
- Create model HeroInfo
C:\Users\dell\Desktop\ALL\python\django\test1>python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: sessions, booktest, contenttypes, admin, auth
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying booktest.0002_heroinfo... OK
如下:生成成功
这个hbook_id 就是关系属性对应的表的字段名
>>> from booktest.models import BookInfo,HeroInfo
>>> a = BookInfo()
>>> from datetime import date
>>> a.btitle = '天龙八部'
>>> a.bpub_data = date(1999,1,1)
>>> a.save()
>>> b = HeroInfo()
>>> b.hname = '乔峰'
>>> b.hgender = False
>>> b.hcomment = '降龙十八掌'
>>> b.hbook = a
>>> b.save()
>>> bb2 = HeroInfo()
>>> bb2.hname = '虚竹'
>>> bb2.hgender = False
>>> bb2.hcomment = '易筋经'
>>> bb2.hbook = a
>>> bb2.save()
查看booktest_heroinfo表中发现两条记录!!!
查看关联对象的方法:
对象名.关联属性
>>> zl = HeroInfo.objects.get(id=1)
>>> zl #获得HeroInfo实例化的对象
<HeroInfo: HeroInfo object>
>>> zl.hbook # 查看关联对象
<BookInfo: BookInfo object>
一对多之间如何查询关系呢?
a(一类) ---------------------------> b(多类)
>>> a.heroinfo_set.all()
[<HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>]
a(一类) <--------------------------- b(多类)
>>> b.hbook
<BookInfo: BookInfo object>
查询相应表中的记录:
模型类.objects.all()
1、修改语言和时区
设置文件:settings.py
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia-Shanghai'
2、创建管理员:
python manage.py createsuperuser
1、打开admin.py
from booktest.models import BookInfo
admin.site.register(BookInfo)
发现后台出现了模型类并且出现其中的记录
但是点进去我们发现名称为 BookInfo object
按理来说我们需要的对应的表名中的记录的标题,在这里也就是我们的btitile
通过发现其实这里的BookInfo object
也就是我们得到str
魔术方法返回的名称
>>> from booktest.models import BookInfo
>>> a = BookInfo.objects.get(id=2)
>>> a
<BookInfo: BookInfo object>
>>> a.btitle
'天龙八部'
>>> str(a)
'BookInfo object'
那么我们就知道了 如果我们在模型类中加入__str__
魔术方法来改变返回的str
名称那么就可以改变界面上的名称
方法:在相应的模型类中加上__str__
方法
通过自定义模型管理类能很好的方便的进行管理
操作方法如下:
在admin.py
class BookInfo_admin(admin.ModelAdmin):
list_display = ['id','btitle','bpub_data']
1、 在应用booktest
中的views.py
定义视图函数,HttpResponse
导入:from django.http import HttpResponse
定义视图函数:
def index(request):
return HttpResponse('hello python') #返回HttpResponse 类对象
2、 建立url与视图之间的关系
urls.py
分为两个 一个是项目的urls.py
文件 还有一个是应用的urls.py
文件
在应用中再创建一个urls.py
文件
代码如下:
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$',views.index),
]
URL路由查询的流程:
顺序: 项目urls.py -----> 应用urls.py
1. 访问url -> http://127.0.0.1:8000/index
2. 应用中的urls.py
会收到/index
然后进行urlpatters
匹配,匹配的时候会去除/
符号,只有index
关键词,当发现匹配的时候url(r'^', include('booktest.urls')),
并且是应用booktest
中的urls
,所以就会到应用中的urls.py
里面就进行匹配 发现url(r'^index$',views.index)
同样匹配成功 就会去调用视图中的index
函数,然后视图把index
函数返回的数据 渲染到浏览器上。
注意:如果视图中又有index2
的函数 在路由匹配的时候会识别到index
的函数 所以正则匹配的时候我们需要严格匹配。
1、创建模板文件夹:
模板文件夹创建于项目中
小技巧:为了让多个应用的模板文件不混淆 所以我们可以在templates中再创建多个应用所对的模板目录
3.使用模板文件
流程:
1)加载模板文件
2)定义模板上下文
3)模板渲染
1):加载模板文件:
我们需要导入loader类,通过这个来加载我们的模板文件
from django.template import loader
2)定义模板上下文
我们需要导入RequestContext类来定义模板上下文
from django.template import RequestContext
3)模板渲染:
res_html = temp.render(context)
4)浏览器渲染:
return HttpResponse(res_html)
这里有个问题:如果我们又有index2的话 岂不是还需要再来一次 所以我们这里可以封装下 方便使用!!!
发现from django.shortcuts import render
本身就帮我们封装好了
我们可以使用下:
def index(request):
return render(request,'booktest/index.html')
{{ content }}
def index2(request):
return render(request,'booktest/index.html', {'content': 'play nini','list': range(0,10)})
for循环:
<li>
{% for i in list %}
<li>{{ i }}</li>
{% endfor %}
</li>