一文入门Django-实现LOL英雄信息展示

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

进入虚拟环境:

# 创建虚拟环境
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,是核心,用于处理请求,获取数据,返回结果;
MVC
将显示部分,数据部分,处理部分进行了分离,其实就是将存在变化可能性的方面进行了分离。

2. Django框架结构–MVT结构

m表示model,负责与数据库交互;
v表示view,是核心,负责接受请求,获取数据,返回结果;
t表示template,负责呈现内容到浏览器;
MVT结构
在模型中不直接编写任何一条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 获取源码(见末尾)

谛听,万事无他,唯手熟尔
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值