经过前面三节的练习,我们已经可以将一个页面动态的展现给用户了。但是真正动态语言还需要连接数据库,将数据库中的内容读取出来呈现在给客户。这一节我们就来实现简单的读写数据库,对数据库进行增删改查等操作。
前面我们讲过django有一个全局的配置文件settings.py,这个文件位于子目录myjango下面。通过这个文件我们可以指定mydjango这个项目使用的数据库类型以及数据库的连接信息。
默认的使用的数据库类型是sqlite3,这里我就不做修改了。如果想连接oracle或者mysql等数据库类型可以自行百度一下。
数据库连接的问题解决之后,我们下一步就是对数据库进行创建表的操作了。django中对数据库的操作有一个专门文件models.py,它位于每个app应用目录的下面,负责管理这个应用的数据库操作。
编辑这个文件
models.py
# !/usr/local/env python# coding:utf-8
from __future__ import unicode_literals
# 首先要导入models方法
from django.db import models
# Create your models here.
"""
编写一个类,类里的参数必须是(models.Model)
类的名字就是要在数据库创建的表名字
"""
class userinfo(models.Model):
"""
这里的user和passwd就是表中要创建的字段名
models.CharField表示要创建的字段类型是字符串类型的
如果创建字符窜类型那么括号里必须指定字符串长度
"""
user = models.CharField(max_length=30)
passwd = models.CharField(max_length=30)
编辑结束之后,我们通过同步数据库的命令创建刚才定义的表。在命令行下输入两条命令
1、python manage.py makemigrations
这个命令相当于创建了表的源数据,执行完这条命令并没有真正的把表创建出来。只是在app01目录下的
migrations目录下创建了一个初始化文件
2、python manage.py migrate
这个命令是根据上一步创建的源文件里的规则,把我们定义的表真的的写到数据库里。
如何来查看表是否按照我的需求创建成功了呢?我们可以通过第三方的工具连接数据库进行查看,也可以使用django自带的方法。对查看数据库的内容。我们来设置一下。在app01目录下找到admin.py
编辑文件的内容
admin.py
# !/usr/bin/env python# coding:utf-8from django.contrib import admin# Register your models here.#导入自定义的表名from app01 import modelsadmin.site.register(models.userinfo)
这样我们就可以访问app01的数据库后台页面了
接着我们要登录到后台,还需要在通过命令创建后台管理页面的账号和密码
python manage.py createsuperuser
密码长度不能低于8位
再次重新登录输入用户名和密码 我们就可以进入后台页面了。并且可以看到我们刚才刚才创建的userinfo表
这个表被默认添加了一个's'变成userinfos了(不知道为什么),不过使用的时候还是要用userinfo表这个名字。点进去之后我们就可以对这个表添加数据了
到这里,表和表里的数据我们就添加完了。接下来我们要通过自己都编写的页面实现对数据库的简单读写。
首先在template目录下新建一个manageruser.index文件。在文件里需要有用户名和密码输入框。一个按钮还有一个表格。并且表格需要用到模版语言能够动态的显示指定的内容。
manageruser.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title></title></head><body><div class="container">{# 定义表单提交的时候采用POST方式提交,并且提交之后还是跳转回本页。#}{# 相当于提交之后刷新自己#} <form action="/manageruser/" method="post"> <div class="form-group"> <label>用户名</label> # 通过name="xxx"来给输入框定义一个标识,会用到这个表示来区分输入框的内容#} <input type="text" class="form-control" name="username" placeholder="请输入用户名"> </div> <div class="form-group"> <label>密码</label> <input type="password" class="form-control" name="passwd" placeholder="请输入密码"> </div> <div class="form-group"> <label class="sr-only">按钮</label> <input class="btn btn-primary" type="submit" value="提交"> </div> <table class="table table-bordered"> <thead> <tr> <th>用户名</th> <th>密码</th> </tr> </thead> <tbody> {# views.py中的manageruser()函数会读取数据库中指定的数据#} {# 并传递给userinfo#} {% for line in userinfo %} <tr> {# 模板语言每次读取一行数据#} {# 并根据model.py指定的数据库表中的字段名来获取对应的值#} <td>{{ line.user }}</td> <td>{{ line.passwd }}</td> </tr> {% endfor %} </tbody> </table> </form></div></body></html>
第二步就是要去app01目录下编辑views.py。我们知道浏览器对web框架发起请求有两种方式get和post。
默认的请求是get方式,而我们刚才已经定义了涉及表单内容的提交的内容请求采用post方式。那现在我们就来根据需求编写用到的manageruser()函数。
views.py
def manageruser(request): # 首先判断页面的请求方式 #如果是POST就表明有表单内容要提交 if request.method=='POST': #根据html文件里输入框的name属性所定义的值来获取数据 username=request.POST['username'].strip() passwd=request.POST['passwd'].strip() #实现添加用户功能 models.userinfo.objects部分是标准搭配必须要存在 # 通过django操作数据库必须以这部分开头,后面的create()是参数 models.userinfo.objects.create(user=username, passwd=passwd) #实现删除指定用户功能 #models.userinfo.objects.filter(user=username).delete() # 实现更新指定用户密码的功能 #models.userinfo.objects.filter(user=username).update(passwd=passwd) #如果是GET就表示只是普通的浏览请求,不对数据库进行任务操作 else: pass #最后将数据库的全部内容都读入到user_info中 userinfo= models.userinfo.objects.all() #将页面最终的内容传递给用户,传递的同时将获取的数据库内容传入给html的userinfo变量 return render(request,'manageruser.html',{'userinfo':userinfo})
最后一步就是要去mydjango子目录的urls.py中添加页面和函数的绑定关系了
urls.py
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/$', views.index), url(r'^user/$', views.user), url(r'^manageruser/$', views.manageruser),]
最后启动服务程序,查看页面运行情况
因为默认采用的是GET方法访问页面,所以我们看到了数据库里刚刚创建的用户。我们在用户名和密码栏中输入一个新的数据。点击提交按钮出发POST方法访问看看能否将新数据写入数据库
提交之后我们看到新的数据已经写入了数据库
现在我们就完成了通过Django简单操作数据库并将数据库内容展现在页面的操作
备注:如果点击提交按钮的时候出现403错误,这是因为django的中间件有一条伪造跨站请求导致的,现阶段我们可以禁用这条配置。修改mydjango子目录的下的settings.py内容如下:
本文出自 “霹雳豆包” 博客,谢绝转载!