文章目录
- Django与数据库介绍
- 简单连接
- 模拟案例
- 需求
- 模板页面
- url路由设置
- 定义视图
- 页面
- 首页
- 详情页
- 添加角色页
Django与数据库介绍
Django连接数据库有两种方式,一直是直接调用原生MySQL数据库进行连接,使用SQL语句和数据库交互进行数据的获取。除此之外,我们还可以使用ORM模型进行连接。之后我会专门写一篇文章介绍ORM模型,当前我们先来看一下如何使用原生MySQL连接数据库。
使用原生SQL连接在真实项目中很少会出现,虽然ORM模型连接数据库因为存在二次转换性能会有小幅度损耗,但在电脑性能越来越强大的今日,因为二次转换所带来的损耗已经可以小到忽略不计的地步了。所以下方我就简单介绍一下连接方法和写一个案例。之后我会重点写一篇ORM模型的使用方法。
简单连接
连接MySQL需要使用pip下载连接库,这里我用的是PyMySQL,如果你常用其他的MySQL库,操作方法大致相同,你可以选用你自己常用的库或看我写的pymysql使用方法教程 下载好后我们可以直接在视图中调用MySQL语句进行使用
如下列代码:
from django.shortcuts import render
from pymysql import *
# Create your views here.
class DBMS:
"""连接数据库"""
def __init__(self):
self.con = connect(host='127.0.0.1', user='root', passwd='root', port=3306, db='django的数据库', charset='utf8')
def data_all(self):
cur = self.con.cursor()
cur.execute("select * from django测试表")
return cur.fetchall()
数据库 = {
'数据库值': DBMS().data_all(),
}
def home(request):
return render(request, 'home.html', context=数据库)
如果你对使用Python操作数据库有所了解,上面代码写的已经算是相当简单了。
这里需要注意的是,使用Django框架是调用MySQL事务会自动提交,不需要使用.commit()
进行提交。
模拟案例
需求
下面我们写一个模拟案例来更深刻的理解如何在使用Django配合数据库。
目标:
- 显示数据库中的角色信息
- 点击角色信息进入角色信息详情页面
- 可以添加角色信息
添加信息的时候会触发CSRF验证,当前我们先在设置(settings.py)中注释掉'django.middleware.csrf.CsrfViewMiddleware',
即可关闭CSRF验证 - 可以删除角色信息
模板页面
分析,根据目标,我们需要三个页面,分别是首页,角色信息添加页面,角色详情页面
可以先做一个模板页面叫tamplate.html如下
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
{% block title %}
<title>模板页面</title>
{% endblock %}
</head>
<body>
<h1><a href="/">点击进入首页</a></h1>
<h2><a href="{% url 'DBMS:add' %}">点击添加新角色</a></h2>
{% block body %}
{% endblock %}
</body>
</html>
url路由设置
然后可以先把路由定义出来,详情页面和删除页面都需要指定值才能进行,所以这里将其设为携参模式。
from django.urls import path
from . import views
app_name = 'DBMS'
urlpatterns = [
path('', views.home, name='home'),
path('content/<uid>', views.content, name='content'),
path('pop/<uid>', views.pop, name='pop'),
path('add/', views.add, name='add')
]
定义视图
视图这块我先把数据库调用写成了一个类,之后在对此类进行调用,其中add对于初学者看上可能会比较复杂,这里简单讲解一下,首先是request.method
的作用是判断当前请求为什么形式,这里我做了一个判断,如果是post请求,则代表是添加内容的请求,直接将接收到的值传入数据库并重定向回首页,如果是get请求,则为其他页面点击进入添加页面。还有删除页面只需要在必要时候进行数据删除即可,无需单独页面即可。
from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
from pymysql import *
# 数据库调用
class DBMS:
"""连接数据库"""
def __init__(self):
self.con = connect(host='127.0.0.1', user='root', passwd='root', port=3306, db='django的数据库', charset='utf8')
def all_data(self):
"""查询所有数据"""
cur = self.con.cursor()
cur.execute("select * from django测试表")
return cur.fetchall()
def one_data(self, num):
"""查询某条数据"""
cur = self.con.cursor()
cur.execute("select * from django测试表 where id={}".format(num))
return cur.fetchone()
def pop_data(self, num):
"""删除数据"""
cur = self.con.cursor()
cur.execute("delete from django测试表 where id={}".format(num))
return '删除成功'
def add_data(self, name, detailed):
"""添加一条信息"""
cur = self.con.cursor()
cur.execute("insert into django测试表 values(0,'{}','{}')".format(name, detailed))
return '添加成功'
def home(request):
# 如果字典放在外面数据库就不会在每次进入页面时刷新,只有重启项目时才会刷新
数据库 = {
'角色数据': DBMS().all_data(),
}
return render(request, 'home.html', context=数据库)
def add(request):
# 点击添加进入此页面时为get请求,直接跳转到添加页面即可,提交时为post请求,这时候我们就需要接收值并重定向到首页
if request.method == 'POST':
# 接收页面中传入的值
name = request.POST.get('name')
detailed = request.POST.get('detailed')
# 将值添加进入数据库
DBMS().add_data(name, detailed)
# 这里使用重定向到首页(重定向时URL会发生改变,使用render时只会渲染页面,不会改变URL)
return redirect(reverse('DBMS:home'))
else:
return render(request, 'add.html')
def content(request, uid):
数据库 = {
'角色数据': DBMS().one_data(uid),
}
return render(request, 'content.html', context=数据库)
def pop(request, uid):
if uid:
DBMS().pop_data(uid)
return redirect(reverse('DBMS:home'))
else:
return HttpResponse('删除失败')
页面
首页
首页可以使用for循环进行表格循环,进行数据的自动填充
{% extends 'tamplate.html' %}
{% block title %}
<title>首页</title>
{% endblock %}
{% block body %}
<table>
<tr>
<th>序号</th>
<th>角色</th>
<th>删除</th>
</tr>
{% for foo in 角色数据 %}
<tr>
<th>{{ forloop.counter }}</th>
<th><a href="{% url 'DBMS:content' uid=foo.0 %}">{{ foo.1 }}</a></th>
<th><a href="{% url 'DBMS:pop' uid=foo.0 %}">删除此角色</a></th>
</tr>
{% endfor %}
</table>
{% endblock %}
详情页
详情页较为简单,就不做介绍了
{% extends 'tamplate.html' %}
{% block title %}
<title>详情页</title>
{% endblock %}
{% block body %}
<h1>角色序号: {{ 角色数据.0 }}</h1>
<h2>角色名称: <br> {{ 角色数据.1 }}</h2>
<h3>角色介绍: <br> {{ 角色数据.2 }}</h3>
<a href="{% url 'DBMS:pop' uid=角色数据.0 %}">删除此角色</a>
{% endblock %}
添加角色页
添加角色需要用到form表单的post方式进行内容的传递
{% extends 'tamplate.html' %}
{% block title %}
<title>添加信息</title>
{% endblock %}
{% block body %}
<form action="" method="post">
昵称: <input type="text" name="name"><br>
详情内容: <input type="text" name="detailed"><br>
<input type="submit" value="提交">
</form>
{% endblock %}
效果如下图