目录

1.Django MTV框架简介

2.基础命令创建项目的配置说明

3.前后端交互案例

4.基于数据库实现数据交互增删改查

Django简介

Django框架的设计模式借鉴了MVC的思想,和MVC不同的点是它拆分的三部分,分别为:(Model)模型、 (Template)模板、以及(View)视图

MVC和MTV知识点补充:

MVC是三个单词的首字母缩写,它们是Model模型、View视图 和Controller控制。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外 壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

(ps:这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。)

Django的MTV

Model模型:负责对象与数据库对象(ORM)

Template模板:负责如何把页面展示给用户

View视图:负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view在调用相应的Model和Template

  

创建一个django项目

1.创建项目
django-admin startproject mysite 2.创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py 3.启动项目
python manage.py runserver  #默认使用8000端口 指定端口
python manage.py runserver 8888  #8888为新指定的端口
python manage.py runserver 127.0.0.1:8000  #还可以指定IP和端口,冒号分割

4.创建app
app01/
migrations
__init__.py
__init__.py
admin.py #admin的配置
apps.py #
models.py #与数据库交互的时候用orm
tests.py #测试
views.py #写函数用 5.数据库迁移
python manage.py makemigrations
python manage.py migrate 6.创建超级用户
python manage.py createsuperuser

原理:
创建好项目以后需要在setting里面做相应的配置,如果是通过命令创建的项目 那么需要自己额外的创建app(app主要用来写具体的功能),和templates(存放模板文件) 以下是登录密码成功后跳转到成功页面的小案例:
1. python manage.py startapp app01 创建app01目录 创建完会自动生成相应的文件
2.创建templates目录
3.配置settings支持app01和Template
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', #添加这行即可 直接引入类
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")], #添加这一行,如果是pycharm创建的项目默认是ok的。
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
中间件注释csrf才能支持表单提交(测试使用)
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
添加mysql配置 第二个案例用,第一个案例不用跟mysql交互so 可直接忽略
import pymysql
pymysql.install_as_MySQLdb() #一般放在settings同级的init文件中
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day14',
'HOST':"127.0.0.1",
"PORT":3306,
"USER":'root',
"PASSWORD":'wang',
}
} 修改静态文件存放,为了以后规范化使用
STATIC_URL = '/static/'   #相当于别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
至此setting告一段落 实例:前后端交互简单案例1
修改url分发器,相当于路由,把用户要执行的操作转发到app01下的views里面,当然函数写在哪儿都行but为了规范化写到views里面
from app01 import views 导入views模块

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index) 写上具体的函数 ]
views里面的代码逻辑
from django.shortcuts import render,redirect,HttpResponse

# Create your views here.
def index(request):
return render(request,'success.html') def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'admin' and pwd == 'admin':
#用户登录成功
return redirect('/index/')
else:
return render(request, 'login.html',{"error":"用户名或密码错误"})
return render(request,'login.html') 模板文件
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="" method="post">
<p>
<label for="username">用户名</label>
<input type="text" id="username" name="user">
</p>
<p>
<label for="password">密码</label>
<input type="password" id="password" name="pwd">
</p>
<p>
{{error}}
</p>
<input type="submit" value="登录">
</form>
</body>
</html> 登录成功后重定向到这个目录下
success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>
登录成功
</h1>
</body>
</html> 验证结果:

python manage.py runserver  启动项目

输入用户名密码正确后

否则

连接数据库后的操作

Django 使用mysql数据库配置
1. 创建一个mysql数据库
2. 在settings中配置数据库:
3. 使用pymysql模块连接mysql数据库
在与settings同级目录下的__init__.py中:
import pymysql
pymysql.install_as_MySQLdb()
4. 创建表,在app下的models.py中写类:
from django.db import models # Create your models here.
class UserInfo(models.Model):
username = models.CharField(max_length=32) # varchar(32)
password = models.CharField(max_length=32) #注释表示删除 5. 执行数据库迁移的命令
python manage.py makemigrations # 创建迁移文件 记录上models.py的变更记录
python manage.py migrate # 执行迁移数据库

orm具体操作:
ret = models.Publisher.objects.all() # 查询所有的数据 对象列表
for i in ret:
print(i,type(i)) # 对象 对应数据库一条数据
print(i.name,i.id) # 属性 字段的值


models.Publisher.objects.filter(name=publisher_name) 查不到就是空列表


models.Publisher.objects.create(name=publisher_name) 新增


models.Publisher.objects.filter(id=id).delete() 删除


修改
publisher_name = request.POST.get('publisher_name')
# 编辑
pub_obj.name = publisher_name # 只在内存中有变化
pub_obj.save() # 保存修改到数据库


模板
{% for pub in ret %}
<tr>
<td>{{ pub.id }}</td>
<td>{{ pub.name }}</td>
</tr>
{% endfor %}

基于数据库实现怎删改查操作实例

1. 查询在数据库读取数据然后在前端文件显示

models.py文件配置
from django.db import models class Pulisher(models.Model):
name = models.CharField(max_length=32) #创建表和字段 python manage.py makemigrations
python manage.py migrate
完了在表里面自行添加几条记录为了展示效果 在url分发器添加执行的函数名
rlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list) #名字对应views里面的函数名 views里面的函数逻辑
from app01 import models #需要导入models模块,基于这个模块来实现后续操作
def publisher_list(request):
ret = models.Pulisher.objects.all()
# for i in ret:
# print(i,type(1))
# print(i.name,i.id)
return render(request,'publisher_list.html',{"ret":ret}) publisher_list.html模板文件配置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>出版社列表</h1>
<table border="">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
</tr>
</thead>
<tbody>
{% for pub in ret %}
<tr>
<td>
{{pub.id}}
</td>
<td>
{{pub.name}}
</td>
</tr> {% endfor %}
</tbody>
</table>
</body>
</html> 结果展示:

ps: 由于我建表的时候publisher_list少写了一个字母,所以后导入models模块的时候名字要一样,否则会报错。

2. 添加实例

models里面添加表

class Pulisher(models.Model):
name = models.CharField(max_length=32) urls添加函数名
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list),
url(r'^add_publisher/', views.add_publisher)
] views里面写具体的实现逻辑,如果添加的字段存在提示即可,如果不存在则添加
def add_publisher(request):
if request.method == 'POST':
publisher_name = request.POST.get("publisher_name")
ret = models.Pulisher.objects.filter(name=publisher_name)
if ret:
return render(request, "add_publisher.html",{"error":"出版社名称已存在"}) models.Pulisher.objects.create(name=publisher_name)
return redirect("/publisher_list/")
return render(request,"add_publisher.html")

add_publisher.html 里面的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>
<label for="">出版社名称</label>
<input type="text" name="publisher_name"><span>{{error}}</span>
</p>
<button>新增</button>
</form>
</body>
</html>

结果展示

添加不存在的直接添加并展示出添加后的结果

3.删除例子

urls添加函数名

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list),
url(r'^add_publisher/', views.add_publisher),
url(r'^del_publisher/', views.del_publisher)
] views里面的函数逻辑
def del_publisher(request):
id = request.GET.get("id") #这里的GET是url携带的参数
models.Pulisher.objects.filter(id = id).delete()
return redirect("/publisher_list/") publisher_list.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>出版社列表</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for pub in ret %}
<tr>
<td>
{{pub.id}}
</td>
<td>
{{pub.name}}
</td>
<td><a href="/del_publisher/?id={{pub.id}}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
验证结果:
访问地址直接点击删除即可。
4.修改操作

urls添加函数
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^publisher_list/', views.publisher_list),
url(r'^add_publisher/', views.add_publisher),
url(r'^del_publisher/', views.del_publisher),
url(r'^edit_publisher/', views.edit_publisher),
] views里面函数逻辑
def edit_publisher(request):
id = request.GET.get("id")
pub_list = models.Pulisher.objects.filter(id=id)#拿到对象列表
print(pub_list)
pub_obj = pub_list[0]
print(pub_obj) if request.method == "POST":
publisher_name = request.POST.get("publisher_name")
pub_obj.name = publisher_name
pub_obj.save() #保存修改到数据库
return redirect("/publisher_list/")
return render(request,"edit_publisher.html",{"pub_obj":pub_obj}) publisher_list原有的基础上添加:
<a href="/edit_publisher/?id={{pub.id}}">编辑</a></td>
edit_publisher.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>
<label for="">出版社名称</label>
<input type="text" name="publisher_name" value="{{pub.obj.name}}"><span>{{error}}</span>
</p>
<button>保存</button>
</form>
</body>
</html> 完成!

Django基础第一篇的更多相关文章

  1. 接口测试基础——第一篇smtplib发送文字邮件

    现在我们就开始进入接口测试框架的知识准备阶段,今天是第一篇,很简单的,就是发送纯文字的电子邮件,会的童鞋可以忽略,不会的就多敲几遍,直到自己能敲出来为止~~ # coding: utf-8 impor ...

  2. Django框架第一篇基础

    一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负 ...

  3. XML基础<第一篇>

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  4. Django基础07篇 ORM操作

    1.新增(类似数据库操作的insert) # 新增 #方式一: models.Category.objects.create(name='MySQL') #方式二: c = models.Catego ...

  5. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  6. Django基础——Model篇(三)

    一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...

  7. Django基础——Model篇(二)

    一 Model连表关系 一对多:models.ForeignKey(其他表)    多对多:models.ManyToManyField(其他表)    一对一:models.OneToOneFiel ...

  8. FFmpeg深入分析之零-基础 <第一篇>

    FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒体基础知识,否则其源代码会非常晦涩难懂.本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一 ...

  9. Flask框架基础--第一篇

    1.flask框架和其他几种框架的优缺点对比 Django : 优点 - 大而全所有组件都是有组织内部开发高度定制化 教科书级别的框架 缺点 - 大到浪费资源,请求的时候需要的资源较高 Flask : ...

随机推荐

  1. 提高 python 效率的一些细节方式

    在列表里面计数 性能:第二种计数方法比第一种快6290倍,为啥因为Python原生的内置函数都是优化过的,所以能用原生的计算的时候,尽量用原生的函数来计算. 过滤一个列表 性能:第二种方法比第一种慢近 ...

  2. YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

    YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CMo ...

  3. nginx反向代理cookie相关

    http://blog.csdn.net/xiansky2015/article/details/51674997 http://www.jianshu.com/p/aeed2a56a3eb

  4. TypeScript01 编译环境的搭建、字符串特性、类型特性

    知识准备:JavaScript满足ES5前端规范.TypeScript满足ES6前端规范 1 TypeScript开发环境 TypeScript代码不能直接被浏览器识别,必须先转换成JS代码:通常是利 ...

  5. GitLab - 代码仓库管理工具GitLab简介

    1 - GitLab 基于git的开源的仓库管理系统项目,使用git作为代码管理工具,并在此基础上搭建web服务,拥有与Github类似的功能. 社区版(Community Edition,CE) 企 ...

  6. 李宏毅 Keras手写数字集识别(优化篇)

    在之前的一章中我们讲到的keras手写数字集的识别中,所使用的loss function为‘mse’,即均方差.那我们如何才能知道所得出的结果是不是overfitting?我们通过运行结果中的trai ...

  7. VUE 1.0

    现代开发模式:vue/react. 20%的时间花在了表现层 传统开发模式:jquery. 80%的时间花在了表现层 MVC——数据.表现.行为分离 视图层(表现层)<----->数据层 ...

  8. 21.根据hive绑定数据统计计算保存到hive表中

    创建upflow表 create external table mydb2.upflow (ip string,sum string) row format delimited fields term ...

  9. tcpdump移植和使用

    转载于:http://blog.chinaunix.net/uid-30497107-id-5757540.html?utm_source=tuicool&utm_medium=referra ...

  10. jdk1.8 -- stream 的使用

    一.stream介绍 stream 是jdk 一个加强的api操作,翻译过来就是流的意思,主要是对Collection 集合的一些操作,流一但生成就会有方向性,类似于自来水管的水流一样,不可以重复使用 ...