Python Django框架基础

1. 简介

Django 是由python 语言写的开源web 开发框架,并遵循MVC 设计模式,自称MVT 框架。

Model:数据处理,内嵌ORM 框架;
View:与MVC 的C 功能相同,接收HttpRequest,业务处理返回HttpResponse;
Temp:与MVC 的V 功能相同,展示层(html),内嵌了模板引擎。

起初是为了开发以新闻发布为主的网站,而开发出这个框架。
所以该框架更适合制作CMS (内容管理)系统。

2. 安装

2.1 虚拟环境介绍

【sudo pip install 包名词】的形式进行安装时,默认路径为【/usr/bin/local/python2.7/disk-package】,当相同内容进行安装时,则会出现覆盖问题,不理想。

虚拟环境:针对不同项目安装的一堆包的集合,可以将不同项目分隔开来。

2.2 虚拟环境创建

# pip3 安装
sudo apt install python3-pip

# 安装虚拟环境(home/.virtualenvs/所有虚拟环境)
pip3 install virtualenv

# 安装虚拟环境命令的封装的包
pip3 install virtualenvwrapper

# 查看是否安装成功
pip3 list

virtualenv(xxx)
virtualenv-clone(xxx)
virtualenvwrapper(xxx)

# 添加环境变量(gedit ~/.bashrc 打开文件最下放追加下列两行代码,保存后退出)
# 若不保存,重新打开命令行后无法使用workon 进入虚拟环境
export WORKON_HOME=$HOME/.virtualenvs
source ~/.local/bin/virtualenvwrapper.sh

# 生效
source ~/.bashrc

# 虚环境名称
mkvirtualenv py_django

# 退出
deactivate

# 进入虚拟环境
workon py_django

# 当前所用的python
which python

输出:
/home/itheima/.virtualenvs/py_django/bin/python
否则输出:
/usr/bin/python

# 补充
# 查看所有虚拟环境
workon tab tab
# 删除虚拟环境(先退出)
rmvirtualenv 虚拟环境名称

2.3 创建项目

# 安装包
# sudo会将包安装到/usr/bin/目录下,用pip install 安装的包在当前虚拟环境中
pip install django==1.8.2

# 进入虚拟环境
workon py_django

# 进入 py_django虚拟环境目录
/home/itheima/.virtualenvs/py_django

# 创建项目
# django-admin statrproject 项目名词
django-admin startproject test1

# 项目地址
/home/itheima/.virtualenvs/py_django/test1

# 提示:做项目时尽量在home 目录下操作,如果在跟目录下做的话,容易出现权限问题,每次都输入sudo 效率低

# 项目默认生成的子文件
test1               # 项目名
├── manage.py       # 项目入口
└── test1           # 与项目同名的模块
    ├── __init__.py # 默认是一个空文件
    ├── settings.py # 设置文件
    ├── urls.py     # url 配置文件
    └── wsgi.py     # 发布

# test1 项目中创建应用
# 进入test1 项目目录
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1

3.4 创建应用

应用:按功能将项目划分为多个应用

# 进入 test1项目目录
/home/itheima/.virtualenvs/py_django

# 创建应用
python manage.py startapp booktest

test1                  # 项目名
├── booktest           # 应用名
│   ├── admin.py       # 后台管理文件
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations      # 数据迁移
│   │   └── __init__.py
│   ├── models.py       # 数据处理层
│   ├── tests.py        # 简单的测试(一般自定义)
│   └── views.py        # 控制层

# 应用安装到settings.py 中
settings.py 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest',
]

3. 模型类(Model)

3.1 定义模型类

from django.db import models

class BookInfo(models.Model):
    title = models.CharField(max_length=20)
    pub_date = models.DateField()

class HeroInfo(models.Model):
    name = models.CharField(max_length=10)
    content = models.CharField(max_length=100)
    gender = models.BooleanField(default=True)
    book = models.ForeignKey(BookInfo)

3.2 生成迁移文件(sql脚本,0001_initial.py)

# 进入项目目录
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1

python manage.py makemigrations

Migrations for 'booktest':
  0001_initial.py:
    - Create model BookInfo
    - Create model HeroInfo

# booktest/migrations 中会生成 0001_initial.py 文件,是一个sql脚本

3.3 执行迁移

根据迁移文件创建表

python manage.py migrate

运行:
Applying booktest.0001_initial... OK

生成数据库和表
db.sqlite3

4. 数据操作(Shell)

4.1 操作单对象

# 进入项目的shell,进行简单的API 操作
# 进入shell(退出用 quit())
python manage.py shell
# 查询所有
>>> from booktest.models import BookInfo
>>> BookInfo.objects.all()
结果:[]

# 追加信息
>>> b=BookInfo()
>>> b.title = '水浒传'
>>> from datetime import date
>>> b.pub_date=date(2020,5,5)
>>> b.save()
结果:[<BookInfo: BookInfo object>]

# 显示追加内容
class BookInfo(models.Model):

    title = models.CharField(max_length=20)
    pub_date = models.DateField

    def __str__(self):
        return self.title
# 修改代码,shell 需要重新进入
结果:[<BookInfo: 水浒传>]

# 修改内容
>>> b = BookInfo.objects.get(id=1)
>>> b.title='神雕侠侣'
>>> b.save()
>>> BookInfo.objects.all()
结果:[<BookInfo: 神雕侠侣>]

# 删除
>>> b.delete()
>>> BookInfo.objects.all()
结果:[]

4.2 操作关联对象

>>> from booktest.models import HeroInfo
>>> h = HeroInfo()
>>> h.name = '李逵'
>>> h.gender = True
>>> h.content = '耍板斧'
>>> h.book = BookInfo.objects.get(id=2)
>>> h.book_id = 2
>>> h.save()
>>> HeroInfo.objects.all()
[<HeroInfo: HeroInfo object>]
>>> 

4.3查询书中关联的英雄(查子表)

>>> book = BookInfo.objects.get(id=2)
>>> book
<BookInfo: 水浒传>
>>> book.heroinfo_set.all()
[<HeroInfo: HeroInfo object>]

4.4 查询英雄属于哪本书

>>> h.book
<BookInfo: 水浒传>

4.5 总结

# 创建
book = BookInfo()
book.xx = xx
book.save()

# 修改
book = BookInfo.objects.get(id=xxx)
book.xx = xx
book.save()

# 删除
book.delete()

# 查询
BookInfo.objects.all()
BookInfo.objects.get()

# 关系
book.heroinfo_set.all()
hero.book

5. 使用后台

5.1 创建超级管理员

pthon manage.py createsuperuser

运行:
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1$ python manage.py createsuperuser
Username (leave blank to use 'itheima'): python
Email address: aaa@163.cn
Password: 
Password (again): 
Superuser created successfully.

5.2 运行服务器

python manage.py runserver

运行:
(py_django) itheima@ubuntu:~/.virtualenvs/py_django/test1$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
May 23, 2020 - 14:27:18
Django version 1.8.2, using settings 'test1.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

提示:对于启动中的服务器,代码修改后,服务器会自动重启

5.3 后台操作

浏览器访问【http://127.0.0.1:8000/admin】可进入管理界面

5.3.1 汉化

默认英文,汉化语言及时区(settings.py 文件)

# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

5.3.2 显示模型

后台页面显示自定义内容(admin.py 文件)

from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(HeroInfo)

5.3.3 显示模型列表信息

admin.py 文件

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ['id','title','pub_date']

admin.site.register(BookInfo,BookInfoAdmin)

6. 视图响应

配置url (正则表达式, 视图)
接收url 请求,获取url 项目名称后面的地址,与所有配置的url 进行匹配,寻找视图

6.1 单纯响应(模板未指定)

# 1.浏览器请求
http://127.0.0.1:8000/index/

# 2.test1/urls.py 中添加应用关联文件,便于多应用管理
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url('^', include('booktest.urls')),
]

# 3.booktest 应用中添加 urls.py 文件,管理该应用中的所有url匹配问题
from django.conf.urls import url
from .views import *
urlpatterns = [
    url('^index/$', index)
]

# 4.应用的 views.py 文件中创建 url 与 页面的映射
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
    # HttpResponse 响应报文
    return HttpResponse('hello word')

# 5.页面响应结果
hello word

6.2 响应指定模板(无参)

# 1.创建模板
# test1/templates/booktest/index.html

# 2.指定返回的页面,简写路径(views.py 中)
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
    # HttpResponse 响应报文
    # return HttpResponse('hello word')
    # render:视图中调用模板
    return render(request,'booktest/index.html')
    
# 3.补全路径 settings.py 
EMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # BASE_DIR 为当前项目所在目录
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
	...
	]

render 补充说明(了解)

# render:django 对下列代码的封装方法
from django.http import HttpResponse
from django.template import loader,RequestContext

def index(request):
	# 1.获得模板
	template = loader.get_temlpate('booktest/index.html')
	# 2.定义上下文
	context = RequestContext(request,['title':'图书列表','list':range(10)])
	# 3.渲染模板
	return HttpRespose(template.render(context))

6.3 响应指定模板(带参)

# 1.模板设定
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{title}}</title>
</head>
<body>
<h1>Hello World</h1>
<hr>
<!--循环输出-->
{%for i in list%}
	<h1>{{i}}</h1>
{%endfor%}
</body>
</html>

# 2.控制层向页面传值
from django.shortcuts import render
from django.http import HttpResponse
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
    # HttpResponse 响应报文
    # return HttpResponse('hello word')
    context = {'title':'django 首页','list':range(10)}
    return render(request,'booktest/index.html',context)

# 模板语言取值

9 综合

9.1 视图从模型类中取值并响应给模板

获取图书列表信息(views.py)

from django.shortcuts import render
from django.http import HttpResponse
from .models import *
# HttpRequest 中封装了所有的请求信息,浏览器的请求报文
def index(request):
    # HttpResponse 响应报文
    list = BookInfo.objects.all()
    context = {'booklist':list}
    return render(request, 'booktest/booklist.html', context)

9.2 模板显示信息并再次发起请求

显示所有书(booklist.html),点击图书查看人物

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书列表</title>
</head>
<body>
<ul>
    {%for book in booklist%}
    <li><a href="/{{book.id}}/">{{book.title}}</a></li>
    {%endfor%}
</ul>
</body>
</html>

9.3 模板请求视图

点击图书显示英雄明细(booktest/urls.py)

# url 映射
from django.conf.urls import url
from .views import *
urlpatterns = [
    url('^$', index),
    url('^(\d+)/$', detail)

9.4 视图响应模板

查询图书中描写的人物(views.py)

def detail(request,id):
    list = BookInfo.objects.get(id=id).heroinfo_set.all()
    content = {'herolist':list}
    return render(request,'booktest/detail.html',content)

9.5 模板显示信息

英雄列表明细模板设定(detail.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>英雄列表</title>
</head>
<body>
<a href="/index">首页</a>
<hr>
<ul>
    {%for hero in herolist %}
        <li>{{hero.name}}</li>
    {%endfor%}
</ul>
</body>
</html>

总结

1 模型类 M
1.1 在Models.py 中定义模板类
1.2 生成迁移
1.3 执行迁移

2 注册admin
2.1 创建超级管理员
2.2 注册模板类
2.3 登陆后台管理数据

3 视图 V
3.1 在views.py 中定义视图
3.2 配置url

4 模板 T
4.1 配置settings.py
4.2 创建目录及文件
4.3 编辑模板文件
4.4 在视图中调用

你可能感兴趣的:(Python)