python 学习Django第一天

第一天的学习:
1、Django框架的了解
2、虚拟环境的创建和使用
3、Django框架的创建和基础文件的作用
4、模型类的设计
5、通过模型类操作数据表中的记录
6、模型类中的关联对象与操作
7、后台管理
8、视图的实现
9、模板的创建和使用

Django的框架介绍:

框架与MVC有所不同,属于MVT框架

我的理解的话一个MVC框架的话正常的来说

C:控制器 来接收相应的客户端传进来的参数或者所要调用的方法 然后下发指令 到M\V

M:模型 来接收C传过来的方法 进行相关的数据库操作 然后再返回到C中

V:视图 通过M传到给C的相关数据 再通过相应的类似php中的smart再进行渲染 然后返回到客户端的浏览器上

而这里的MVT框架又是如下:

M:表示model,负责与数据库交互
V:表示view,是核心,负责接收请求、获取数据、返回结果
T:表示template,负责呈现内容到浏览器
python 学习Django第一天_第1张图片




安装虚拟环境virtualenv:

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

python 学习Django第一天_第2张图片
python 学习Django第一天_第3张图片

3、退出的命令deactivate

python 学习Django第一天_第4张图片

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




创建Django项目:

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

python 学习Django第一天_第5张图片
看下其中的目录结构:

(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 学习Django第一天_第6张图片

运行项目

python manage.py runserver

python 学习Django第一天_第7张图片




模型类:

模型类的设计:

首先在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

python 学习Django第一天_第8张图片
这里生成的迁移文件是根据模型类生成的

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根据迁移文件去生成表

生成表名的默认格式:

应用名_模型类(小写)

如下图:
python 学习Django第一天_第9张图片

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'

python 学习Django第一天_第10张图片

查询相应的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()#更新/保存操作

python 学习Django第一天_第11张图片

删除相应的id的记录数据:

>>> b2 = BookInfo.objects.get(id=1)
>>> b2 = delete()
>>>

python 学习Django第一天_第12张图片




模型类中的关联对象的操作:

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

如下:生成成功
python 学习Django第一天_第13张图片
这个hbook_id 就是关系属性对应的表的字段名
python 学习Django第一天_第14张图片

>>> 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表中发现两条记录!!!
python 学习Django第一天_第15张图片

查看关联对象的方法:

对象名.关联属性

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

结果:
python 学习Django第一天_第16张图片
3、注册模型类:

1、打开admin.py

from booktest.models import BookInfo


admin.site.register(BookInfo)

发现后台出现了模型类并且出现其中的记录
python 学习Django第一天_第17张图片
但是点进去我们发现名称为 BookInfo object 按理来说我们需要的对应的表名中的记录的标题,在这里也就是我们的btitile
python 学习Django第一天_第18张图片
通过发现其实这里的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__方法

python 学习Django第一天_第19张图片
结果:
python 学习Django第一天_第20张图片
4、自定义模型管理类:

通过自定义模型管理类能很好的方便的进行管理

操作方法如下:
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、创建模板文件夹:

模板文件夹创建于项目中
python 学习Django第一天_第21张图片
小技巧:为了让多个应用的模板文件不混淆 所以我们可以在templates中再创建多个应用所对的模板目录

2.定义模板文件的存放的路径
python 学习Django第一天_第22张图片

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)

结果:
python 学习Django第一天_第23张图片
python 学习Django第一天_第24张图片

这里有个问题:如果我们又有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>

python 学习Django第一天_第25张图片

你可能感兴趣的:(python,django)