文章目录

  • 一.用到的命令的简单总结
  • 二. Diango简介
    • 1. 思想--MVC框架
    • 2. Django框架结构--MVT结构
  • 三.创建环境
    • 1.搭建py虚拟环境
    • 2.创建Django项目test1
  • 四.模型类
    • 1.创建应用
    • 2.编写models
    • 3.迁移操作
    • 4.测试数据操作
  • 五.后台管理
    • 1.创建一个管理员用户
    • 2.向admin注册herotest的模型
    • 3.自定义管理页面
  • 六.后台关联添加
  • 七.视图
  • 八.使用模板
  • 九.使用视图来从模型中来查数据
  • 十.使用视图详细展示
  • 十一.总结
  • 公众号回复 Django 获取源码(见末尾)

一.用到的命令的简单总结

进入虚拟环境:

# 创建虚拟环境
virtualenv --no-site-packages venv
# 通过source进入当前的环境
source venv/bin/activate
# pip安装
pip install django

django的命令:
创建项目:

django-admin startproject

创建app:

python manage.py startapp

生成迁移文件:

#根据模型类来生成一个迁移文件
python manage.py makemigrations
# 把应用注册到settings中;
# 把迁移文件迁移
python manage.py migrate

启动服务器

python manage.py runserver
# 创建管理员用户:
python manage.py createsuperuser
# admin的使用:
admin.site.register(模型类,admin类)

二. Diango简介

1. 思想–MVC框架

MVC框架的核心思想是:解耦,为了降低各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用。
高可扩展性,不会因为某个环节的变更而导致整个项目不能跑起来;
低耦合,模块和模块之间没有太强的依赖;
m指的是model,主要用于对数据库层的封装;
v指的是view,用于向用户展示结果;
c表示controller,是核心,用于处理请求,获取数据,返回结果;

将显示部分,数据部分,处理部分进行了分离,其实就是将存在变化可能性的方面进行了分离。

2. Django框架结构–MVT结构

m表示model,负责与数据库交互;
v表示view,是核心,负责接受请求,获取数据,返回结果;
t表示template,负责呈现内容到浏览器;

在模型中不直接编写任何一条SQL语句,模型Model只管理对象,而对象则对应于数据库中的一行。

三.创建环境

1.搭建py虚拟环境

创建虚拟环境是为了避免每次安装库互相冲突,具体操作可以参考如下链接:
Mac下的Python环境搭建开发常用总结

2.创建Django项目test1

# 在虚拟环境中运行
django-admin startproject wjp_te

运行完成后,它会将项目中需要的最基本的配置创建出来,进入test1中有如下文件:

我们可以看到有两层test1,第一层的wjp_test为项目文件
manage.py用来管理项目的文件,其中发现第二层wjp_test下有一个init文件,这就表示wjp_test为一个模块,其表示项目基本的配置。

__init__.py: 表示一个空文件,它告诉python这个目录应该被看作是一个Python包
settings.py:项目的配置
urls.py:项目的url声明
wsgi.py:项目与WSGI兼容的Web服务器入口

四.模型类

我们知道Django包括三大块,而模型类要做的就是完成和数据库的交互。

1.创建应用

在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
在当前的项目目录下创建应用(所建的第一层项目名):

python manage.py startapp herotest


生成的文件如下:

我们看到了下有个migrations的文件,其意思表示’迁移’,即根据当前项目中的模型类,来生成数据库脚本,并将数据库脚本映射到数据库中去的过程即为迁移。
models.py将定义模型类,views.py将定义视图类。

2.编写models

在这里我们自己定义的类不是一个普通的类,它将作为模型来使用,即将来会通过类的对象来操作数据库,于是需要让其继承models.Model。
定义类的目的是:
1.能够根据定义去生成sql语句,并创建表;
2.根据模型类去创建对象,我们对于模型类的对象的操作,是可以映射到数据库中,对数据库进行改变的。

这里我们可以先来启动下项目,观察项目是否可以正常启动:

python manage.py runserver 8080

于链接访问,项目正常启动:

3.迁移操作

在做完了模型类后,应该做一个迁移操作,迁移操作有三个步骤:
第一,在settings文件激活模型,编辑settings.py文件,将herotest应用加入到installed_apps中,目的是为了把创建的应用注册到项目中;
第二,生成迁移文件,先make migrations,即生成迁移,根据当前的模型类去生成你选择的数据库特定的SQL语句。(数据库在settings中进行配置更改)

python manage.py makemigrations

得到如下结果:

而与此同时,我们可以看到migrations中的版本新增加了一个文件:

这其中的语句在将来将会转化为SQL语句去执行操作数据库;
第三,执行迁移,根据执行迁移生成的文件到数据库中执行特定的SQL语句,进而创建表,如下:

python manage.py migrate

4.测试数据操作

进入python shell,进行简单的模型API的练习:

python manage.py shell

在shell环境下创建应用的对象:

#这里注意正常的datetime构建时需要传入时区
from herotest.models import *
b =BookInfo()
b.btitle = 'abc'
from datetime import datetime
b.bpub_date = datetime(year=1990,month=1,day=12)
b.save()
#最后查看对象
BookInfo.objects.all()
#结果为:<QuerySet [<BookInfo: BookInfo object (1)>]>

得到的结果为返回一个对象,那么如何让其返回一个字符串呢?
我们可以对modles中再进行修改,即为其添加一个方法,如下:

加过后,这时会需要考虑一个问题,此时的文件需要对其进行迁移吗?我们知道数据库表中存的是数据,而新加的是方法,并未对数据字段做任何处理,所以不需要进行迁移。
再在shell中import,得出结果如下:

此处定义类属性的目的是,映射Sql语句的表结构。
BookInfo类是为了生成表用的,而其实例对象是为了生成insert语句用的。
新建一个对象,通过save方法,其会映射为一条insert语句;如果get找到的,再通过save方法,其会映射一条update语句。
整个对象和数据库中一点关系都没有;

# 怎样来理解?
BookInfo.objects.all()
#举个例子:
class Person():objects = Manage()def __str__(self):return 'abc'
class Manage():def all(self):return "abc"
Person.objects.all()

这里其实有个很有意思的事情,我们并没有写任何sql语句,但是数据却已经写入到了数据库。我们的所有操作都是面向对象的,而其内部会将这些转化为sql语句去执行。
相应于添加,还可以查找,修改,删除:

#查找
b = BookInfo.objects.get(pk=1)
#修改图书信息
b.title = u"天龙八部"
b.save
#删除图书信息:
b.delete()

五.后台管理

1.创建一个管理员用户

#创建一个管理员用户,按提示输入用户名,邮箱,密码
python manage.py createsuperuser

创建完成后,输入用户名和密码:

可以看到管理员创建成功,再次通过python manage.py runserver启动下server,在打开的url后跟上/admin登陆:

得到如下界面:

但是发现其中并没有我们创建的模型类的信息,那么我们需要把模型类注册到管理中来,在添加注册之前,我们先将管理界面**本地化-**即调整时区和显示语言为中文:

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

修改完配置文件后,服务器会自动重启,如下:

2.向admin注册herotest的模型

在创建的项目中,admin模块就是用来做做管理功能的,定义模型类是在models里面写的,注册到管理员里是在admin的文件中写的。
打开herotest/admin.py文件,注册模型:

from django.contrib import admin
from .models import BookInfo
admin.site.register(BookInfo)

显示如下:

3.自定义管理页面

在注册时,可以在admin文件中,可以先定义一个显示方式的类,继承于ModelAdmin,注册时就可以通过这个类来定义显示方式,过程如下:

class QuestionAdmin(admin.ModelAdmin):#表示管理时显示的方式pass
admin.site.register(Question,QuestionAdmin)

自定义管理页面可以分为:修改列表页属性和修改页属性
列表页属性即修改列表页内的显示方式,其包括:

  • list_display:显示字段,可以点击列头进行排序
    (默认的显示方式是基于str方法进行显示的)
    list_display = [‘pk’,‘btitle’,‘bpub_date’]
  • list_filter:过滤字段,过滤框会出现在右侧
    list_filter = [‘btitle’]
  • search_fields:搜索字段,搜索框会出现在上侧
    search_fidlds = [‘btitle’]
  • list_per_page:分页,分页框会出现在下侧,表示一页显示多少个,为10则一页显示10个
    list_per_page = 10
    显示如下:

    添加,修改页属性即修改页项目的显示方式,其包括:
  • fields:属性的先后顺序
    fields = [‘bpub_date’,‘btitle’]
  • fieldsets:属性分组
    fieldsets = [
    (‘basic’,{‘fields’ : [‘btitle’]}),
    (‘more’,{‘fields’ : [‘bpub_date’]}),
    ]
    显示如下:

六.后台关联添加

对于HeroInfo关联对象,有两种注册方式:
方式一,与BookInfo的模型类相同;
方式二,关联注册;
按照BookInfo的注册方式完成HeroInfo的注册;
那么英雄类别对应英雄是一对多的关系,我们想在添加类别的同时,再添加英雄进去。该怎么实现呢?
我们在admin,py中添加:

class HeroInfoInline(admin.StackedInline):# 指示把哪个模型类嵌入进去model = HeroInfo# 用来表示额外添加几个数据extra = 2
class BookInfoAdmin(admin.ModelAdmin):# 指内部嵌套inlines = [HeroInfoInline]
# 添加admin
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo)

效果如下:

如果你觉得这种stack形式看着不舒服的话,也可以将其定义为表格形式,如下:

class HeroInfoInline(admin.TabularInline):

结果显示如下:

这里注意,通过extra = 2的方式表示最少额外添加两个,多余添加的可以删除,但这两个不能删除。

七.视图

数据有了,希望别人看到数据,应该有客户端通过浏览器,请求过来信息,请求过信息后,由某个视图来进行处理;
而视图的本质就是个函数。

views中:
from django.http import *
def index(request):return HttpResponse('hello world')

那么视图定义好了,怎么来请求它呢?
都会又一个rout的配置,我们知道,所有的配置都在settings中出现;
但setting中并未直接配置urls,但它其中有句:
ROOT_URLCONF = ‘wjp_test.urls’
故可以通过urls的文件来查看url的配置;

在urls中添加:

from django.contrib import admin
from django.conf.urls import include,url
# from herotest import views
urlpatterns = [path('admin/', admin.site.urls),url(r'^',include('herotest.urls'))
]

在每个应用当中,自己定义的url,一般在应用中加一个urls.py的文件,为了防止将大量的url写到一起去,于是我们在自己创建的应用中添加url文件,并写入:

from django.conf.urls import url
#指向视图
from . import  views
urlpatterns = [#由它去解析指向index视图url(r'^$',views.index)
]

其实这里还有很多细节值得玩味,比如什么情况会报404?以后会总结些细节。

最后我们回归一下过程
先填写url地址,如:www.baidu.com/
接着发请求给MVT,拿到请求后把域名部分去掉,只拿域名后面的部分。拿到后面部分后,根据正则表达式的结构中去匹配,然后相应的根据匹配到的内容来执行处理。

八.使用模板

简单解释一下模板,模板其实就是html页面,其可以根据视图中传递的数据填充项。
在项目的目录下添加一个templates的目录,该目录与manage同级。
在templates目录下再添加一个项目同名的Directory,如下图所示:


这里表示的意思是,其实模版templates可以添加好多个模版,但是其以应用来划分,一个应用对应上一组模版;
此时模版就定义完成了,模版定义完成后,我们要交给视图层(View)去用,在视图运行时,我们需要让其去找模版,即要引入一些基本的包。下面对Views模版进行编辑:

上面代码实质上的意思就是加载模版,并将模版的内容返回给浏览器。但是仅仅这样会报错,原因是我们将模板放在了项目的根目录下,需要指定view来加载模版。
那么我们需要对settings进行设置,settings中的dirs定义了模版的路径

我们在其中添加路径:

os.path.join(BASE_DIR,'templates')

这里我们总结一下模版的用法:

  1. 模板需要在项目的根目录下搭建一个目录叫templates,
  2. 接着在settings中配一个路径,指定去找模版的路径;
  3. 在视图中用的时候,使用loader的方法在视图中用的时候,使用loader的get_template方法来加载模板,目录为基于templates下面的目录。将html的内容返回,最后再将返回的内容,通过render的方法渲染返回;

但是这种方法在处理的过程中,因为每次都要进行先获取html,再渲染解析,有点繁琐。于是我们可以使用快捷健的方式来处理。
views如下:

九.使用视图来从模型中来查数据

现在模版有了,视图有了,但是还没有数据。事实上,在第八讲中的render方法,在写的时候,第三个参数就是要传递的数据(按照字典的方式来传):
render方法在写的时候,其第三个参数即为要传递的数据,默认为None,传的时候按照字典的格式来传递。
那么在views中:

from django.http import *
from django.shortcuts import render
def index(request):context = {'hero':'hello'}# 第一个参数为request对象,第二个参数为模版路径return render(request,'herotest/index.html',context)
#render方法实质就是加载模版并进行渲染,渲染就是解析其中的内容

此时在模板的写法中,就可以进行‘挖坑’,以便于views中进行传值。
index.html构造如下:

实现效果如下:

下面我们将view与temple之间打通了,那么我们接下来需要在view层中从模型中去拿数据:

在views层中引入模型类,通过BookInfo.objects.all()的方法获得对象的列表,如下:
from .models import BookInfo
def index(request):bookList = BookInfo.objects.all()context = {'list':bookList}# context = {'hero':'hello'}# 第一个参数为request对象,第二个参数为模版路径return render(request,'herotest/index.html',context)

接着在模版文件的index中,我们需要响应views中的数据:

#通过{%%}来嵌入py语言,通过{%endfor%}来表示结束;
<ul>
{%for book in list%}<li>{{book.btitle}}</li>
{%endfor%}
</ul>

到这里我们先进行总结一下到这里的流程:
首先去定义model类,接着生成迁移文件,目的是为了生成表。
接着去生成view类,接着为了视图view能被调用,我们需要配置url,url即用户请求的网址,即让你这个url和网址匹配上,那么这个视图就会被调用。
再接着视图被调用时,就可以使用模型来获取数据。模型获取数据需要呈现出来,即通过模版templete来展示。
在模版中定义好html,再通过视图加载模版,并完成解析,得到最终的html.最终的html再通过view的返回值response,最终浏览器接受response并执行显示。

十.使用视图详细展示

刚刚在第九步中,我们仅仅展示了BookInfo对象的信息,那么如果我们怎样通过BookInfo对象,进而详细显示英雄的信息呢?
思路是让用户点击超链接,接着形成一个新的地址,在新的地址中访问英雄的信息。
这里我们用对象的id作为链接的index:
index.html定义如下:

<ul>
{%for book in list%}<!--<li>--><!--{{book.btitle}}--><!--</li>--><li><a href="{{book.id}}">{{book.btitle}}</a></li>
{%endfor%}
</ul>

接下来我们需要在urls中去匹配正则:

from django.conf.urls import url
#指向视图
from . import  views
urlpatterns = [#由它去解析指向index视图url(r'^$',views.index),#正则中加上小括号表示又是一个新的参数,需要接受url(r'^(\d+)$',views.show),
]

接着我们来定义views层中的接受方法show,在views中:
根据id查到那个类,再根据类查到其下的英雄,再把英雄传过去,如下:

def show(request,id):book = BookInfo.objects.get(pk=id)# _set表示这个类对应的所有的英雄# .all方法相当于做下查询herolist = book.heroinfo_set.all()context = {'list':herolist}return render(request,'herotest/show.html',context)

最后,在templates的目录下的herotest下创建show.html,如下:

最后反映的结果如下:

十一.总结

  • 视图View:
    作用:接受请求,逻辑处理,调用数据,输出response响应;

  • 配置url:
    作用:只要有一个视图views,就要有一个唯一的正则和它相对应。不配url,视图就无法被调用响应。
    方法:项目中可能存在多个应用,故不在根级的项目的url中去配置正则,而是在自己的应用中配置正则url(正则表达式,视图的名称)

  • 模型Models:
    作用:负责和数据库进行交互
    方法:面向模型对象,只需要操作py中的一个类得到对象,对这个对象进行save操作。它会转换为sql语句,把数据保存到数据库中去。
    对列表进行操作;
    需要去定义模型类,定义模型类时,需要指定属性及类型,以确定表的结构–类的名字就是表的名字,类属性的名字就是表字段的名字,等号后面的类型就是字段在表中的类型。
    通过迁移生成表;

  • 后台管理:
    方法:创建管理员->启动服务器在->settings注册admin.py->通过在地址后加上/admin

  • 模板Templates:
    作用:定义显示的样子,加载文件的内容到内存,对views传来的数据进行渲染


公众号回复 Django 获取源码(见末尾)

谛听,万事无他,唯手熟尔

一文入门Django-实现LOL英雄信息展示相关推荐

  1. 一文入门HTML+CSS+JS(样例后续更新)

    一文入门HTML+CSS+JS(样例后续更新) 前言 HTML,CSS和JS的关系 HTML head元素 title link meta body元素 设置网页正文颜色与背景颜色 添加网页背景图片 ...

  2. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  3. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  4. py222基于python+django的高校学生信息管理系统

    开发语言:Python 编号:py222基于python+django的高校学生信息管理系统#毕业设计 python框架:django 软件版本:python3.7/python3.8 数据库:mys ...

  5. Python-王者荣耀自动刷金币+爬取英雄信息+图片

    ####前提: 本文主要功能是: 1.用python代刷王者荣耀金币 2.爬取英雄信息 3.爬取王者荣耀图片之类的. (全部免费附加源代码) 思路: 第一个功能是在基于去年自动刷跳一跳python代码 ...

  6. 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)

    最近博主在看强化学习的资料,找到这两个觉得特别适合入门,一个是"一文入门深度学习",一个是"莫烦PYTHON". 建议:看资料的时候可以多种资料一起参考,一边调 ...

  7. 【python毕业设计】Django框架实现学生信息管理系统

    Django框架实现学生信息管理系统 演示视频:Django学生信息管理系统_腾讯视频 演示界面内容如下 总体概括 注册流程 首先进行输入用户名(邮箱).密码以及验证码,输入完之后点击注册按钮.如果输 ...

  8. django2.1支持的mysql版本_一文解决django 2.2与mysql兼容性问题

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS( ...

  9. Kali Linux 从入门到精通(八)-主动信息收集

    Kali Linux 从入门到精通(八)-主动信息收集 基本介绍 直接与目标系统交互通信 无法避免留下访问的痕迹 使用受控的第三方电脑进行探测 使用代理或已经被控制的主机 做好被封杀的准本 使用噪声迷 ...

最新文章

  1. Android 逐帧动画(Frame)
  2. 【Linux】15.mdc启动网卡并设置其ip和子网掩码
  3. NAT的全然分析及其UDP穿透的全然解决方式
  4. 玩够了没,开始奋斗吧?
  5. 互联网产品的灰度发布
  6. Ubuntu 命令行修改网络配置方法
  7. 整合Flume和Kafka完成实时数据采集
  8. linux在什么环境运行,Linux环境变量是什么
  9. 使用Filter防止浏览器缓存页面或请求结果
  10. ML.NET 发布0.11版本:.NET中的机器学习,具有TensorFlow和ONNX的新功能
  11. Git 提交的正确姿势:Commit message 编写指南
  12. oracle ora-22992,ORACLE ORA--22992:无法使用远程表选择的LOB定位器,database link
  13. java 注册表 下载_Java修改windows注册表(完全修改)
  14. Scott Mitchell 的ASP.NET 2.0数据操作教程之九:跨页面的主/从报表
  15. 2、认识常见网络设备
  16. 年薪百万计划之高级JAVA架构师之路视频教程
  17. 新手入门、HTML制作简易导航条方法,解释每行代码意思,小白入门也能懂!实现html导航栏的多种方法
  18. Python的Code对象
  19. [工业互联-2]:工业有线互联总线之CAN总线
  20. php星空背景动态,纯CSS3炫酷3D星空动画特效

热门文章

  1. PHP中的 empty() 函数和 isset() 函数
  2. 第三方QQ登录时,获取unionID的问题
  3. flex布局怎样让div居中
  4. 树莓派4的串口启用设置
  5. 双网卡网关问题(route add -p) 关于静态路由
  6. android自动化测试抖音,手机自动化测试IDE-----Airtest实战篇
  7. Hadoop2.6.5单机安装
  8. Dubbo的原理与机制
  9. 23种设计模式总结及应用案例
  10. kotlin模拟java三目运算