一文入门Django

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29027865/article/details/86200256

目录:

一. 简介

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的方式表示最少额外添加两个,多余添加的可以删除,但这两个不能删除。

六.使用模板

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

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

猜你喜欢

转载自blog.csdn.net/qq_29027865/article/details/86200256