基础配置:
新创一个django项目,取名为homework_book
在setting里进行基础配置
DATABASES={ 'default':{ 'ENGINE' : 'django.db.backends.mysql', #连接MYSQL数据库 'NAME' : 'bookhomework', #设置连接的库名 'HOST':'127.0.0.1', #设置本地连接方式 'POST':3306, #设置端口号 'USER':'root', #以root用户权限登陆数据库 'PASSWORD':'', #写入sql数据库登陆密码,没有设置不写 'OPTIONS':{ #设置严格模式 'init_command':'set sql_mode="STRICT_TRANS_TABLES"', } } }
(严格模式的设置:当传入一个字符串大于设置本身最大长度字符串时,就会报错,这样不会传入一个截取不了全部的字符) STATIC_URL = '/static/' #别名设置 ,别名的设置让html文件直接引入改路径,即使别名名称更改,也不要紧 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'statics') ]
在与settings.py文件同级目录下的__init__文件中设置
import pymysql pymysql.install_as_MySQLdb()
在models.py文件中写入数据,是给数据库中的表格添加数据类型:
from django.db import models #引入models模块 # Create your models here. class Book(models.Model): name=models.CharField(max_length=32)#设置名字,类型为字符串类型,最大长度为32个字符 price=models.FloatField()#设置价格,类型为浮点型 date=models.DateField() #设置时间 publisher=models.CharField(max_length=32)#设置出版社名称,名字最大长度为32个字节 运行manage.py,输入命令,进行数据库表格数据的同步: makemigrations migrate 以上两行代码执行成功后,在python中的databases中连接数据库,即可看到连接的库中创建的表格,再在数据库中添加数据就行
在项目文件夹下创建一个statics文件夹,该文件负责存储静态文件,将下载好的bootstrap文件和jquery-3.4.1文件传入其中,为之后的html文件引用用
在templates文件中创建一个show_books.html文件:
{% load static %}#引入静态文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href=" {% static 'bootstrap/css/bootstrap.min.css' %}"> </head> <body> <div class="container-fluid"></div> <h1>查看书籍</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div><a href="{% url 'add_book' %}" class="btn btn-primary">添加书籍</a></div> <table class=" table table-bordered table-hover table-striped"> <thead> <th>编号</th> <th>书籍名称</th> <th>价格</th> <th>出版日期</th> <th>出版社</th> <th>操作</th> </thead> <tbody> {% for books_obj in all_books_objs %} #使用for循环来让数据库中的各行数据逐个调价到表格中 <tr> <td>{{ forloop.counter }}</td> <td>{{ books_obj.name }}</td> <td>{{ books_obj.price }}</td> <td>{{ books_obj.date|date:'Y-m-d' }}</td> #这个时间格式设置是将原本的date格式转换为普通用户也能看懂的格式 <td>{{ books_obj.publisher }}</td> <td><a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">编辑</a> {# <a href="/del_book/{{books_obj.pk }}" class="btn btn-danger">删除</a>#} <a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">删除</a> #(两种方法实a标签的跳转,一个是固定格式路径的,一个是引入静态文件的) </td> </tr> {% endfor %} </tbody> </table> </div>
在urls和views里的配置
urls: from app01 import views urlpatterns = [ url(r'^show_books/', views.show_books,name='show_books'), views: from django.shortcuts import render,HttpResponse,redirect from app01 import models def show_books(request): if request.method=='GET': all_book_objs=models.Book.objects.all() #引入数据库中所有数据的对象 return render(request,'show_books.html', {'all_books_objs':all_book_objs}) #将对象写入到html文件中去
效果图:
此时我们需要做的是点击按钮,做出相应的点击事件,首先配置添加书籍按钮
点击添加书籍按钮的流程步骤:
1.点击添加按钮,跳转到添加书籍信息的网址中
2.写入相关的要添加的书籍的信息
3.点击提交按钮,将添加的信息写入到数据库中
4.再次跳转到查看书籍的网页当中去
5.此时查看书籍调取的是数据库表格中的所有信息,就会将所有的信息展示出来,包括新创建的书籍信息
首先给查看书籍网页中的添加按钮添加一个a标签,让他点击就自动跳转到添加书籍的网页中去
<div><a href="{% url 'add_book' %}" class="btn btn-primary">添加书籍</a></div>#href里的大括号里的内容代表的是动态引入url网页的意思,add_book网页放的是同级目录下,所以可以直接写文件名,如果想要动态引入的话,在urls.py配置里面也必须添加上相关的
路径名称
跳转到add_book网页中,进行相关的网页添加书籍信息配置:
{% load static %}#别名的引入 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> #这个是引入bootstrap文件,利用别名的路径设置 </head> <body> <div class="container-fluid"></div> <h1>添加书籍</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> #创建一个表单格式,提交的按钮请求方式为post方法,提交后路径跳转名称还是为'add_book' <form action="{% url 'add_book' %}" method="post" > {% csrf_token %} <div class="form-group"> <label for="exampleInputEmail1">书籍名称</label> <input type="text" class="form-control" id="exampleInputEmail1" placeholder='书籍名称' name="name"> </div> <div class="form-group"> <label for="exampleInputEmail2">书籍价格</label> <input type="text" class="form-control" id="exampleInputEmail2" placeholder='书籍价格' name="price"> </div> <div class="form-group"> <label for="exampleInputEmail3">出版日期</label> <input type="date" class="form-control" id="exampleInputEmail3" name="date"> </div> <div class="form-group"> <label for="exampleInputEmail4">出版社</label> <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher"> </div> <button type="submit" class="btn btn-success pull-right">Submit</button> #写入一个button提交按钮 </form> </div> </div> <script src="{% static 'jquery-3.4.1.js' %}"></script> <script src="{% static 'bootstrap/js/bootstrap.min.js'%}"> #同样引入bootstrap的js文件 </script> </body> </html>
在urls和views里的配置
urls: from app01 import views url(r'^add_book/', views.add_book,name='add_book'), views: def add_book(request): if request.method=='GET': return render(request,'add_book.html')
效果图
设置add_book里的点击按钮事件点击之后就将写入的信息保存到数据库中,设置按钮点击的请求方式为post请求方式,添加views函数的数据
from app01 import models def add_book(request): if request.method=='GET': return render(request,'add_book.html') else: #此时的否则就是当为post请求提交时,做出以下操作 print(request.POST) #将html文件表单里的内容逐个提取出来,并进行赋值 # name=request.POST.get('name') # price=request.POST.get('price') # date=request.POST.get('date') # publisher=request.POST.get('publisher') #第二种方法,获得html表单里的内容,并将以字典的格式展现 book_info_dict=request.POST.dict() print(book_info_dict) #将字典中多余的键值对删除掉 del book_info_dict['csrfmiddlewaretoken'] #进行数据库的数据创建,以字典的打散形式进行传输数据,同样实现功能 models.Book.objects.create(**book_info_dict) #数据库进行创建新的数据 # models.Book.objects.create( # name=name, # price=price, # date=date, # publisher=publisher # ) #进行页面跳转 return redirect('show_books')
(最后一步进行网页跳转到show_books网页中,也可以使用return render方式的方法进行,但是如果只传入一个网页,那么里面的每行数据不会体现出来,只会出现一个标题栏,因为并没有将数据库中的全部数据全部提取出来,并进行写入html网页的这步操作,所以才会这样,所以还要加上这一步;
综上所述,直接使用redirect跳转方式可以直接找到数据,建议使用redirect方法)
在show_books网页中设置删除按钮和编辑按钮点击事件
给show_books里的删除按钮增加a标签的跳转功能
<a href="{% url 'del_book' books_obj.pk %}" class="btn btn-danger">删除</a>#跳转的数据为del_book/后面是点击的删除的按钮的id号
urls和views里的配置:urls:
url(r'^del_book/(d+)', views.del_book,name='del_book'), #此时在这里配置加上数字的正则匹配符,就是获得第几行点击的删除按钮,回来执行函数时,可以直接找到该行数据并进行删除 views: def del_book(request,n): #n参数代表的时传入的是第几行数据 models.Book.objects.filter(pk=n).delete() #数据库找到关于第几行的数据,并进行删除
return redirect('show_books')
编辑按钮点击事件的内容编辑:
首先在show_books按钮的编辑按钮增加跳转内容
<a href="{% url 'edit_book' books_obj.pk %}" class="btn btn-warning">编辑</a>
编写一个edit_book.html文件
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> </head> <body> <div class="container-fluid"></div> <h1>修改书籍</h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form action="" method="post" > {% csrf_token %} <div class="form-group"> <label for="exampleInputEmail1">书籍名称</label> <input type="text" class="form-control" id="exampleInputEmail1" placeholder='书籍名称' name="name" value="{{ res.name }}">#设置表格里的内容生成为本行的原来内容 </div> <div class="form-group"> <label for="exampleInputEmail2">书籍价格</label> <input type="text" class="form-control" id="exampleInputEmail2" placeholder='书籍价格' name="price" value="{{ res.price }}"> </div> <div class="form-group"> <label for="exampleInputEmail3">出版日期</label> <input type="date" class="form-control" id="exampleInputEmail3" name="date" value="{{ res.date }}"> </div> <div class="form-group"> <label for="exampleInputEmail4">出版社</label> <input type="text" class="form-control" id="exampleInputEmail4" placeholder='出版社' name="publisher" value="{{ res.publisher }}"> </div> <button type="submit" class="btn btn-success pull-right">Submit</button> </form> </div> </div> <script src="{% static 'jquery-3.4.1.js' %}"></script> <script src="{% static 'bootstrap/js/bootstrap.min.js'%}"></script> </body> </html>
在urls和views里的配置:
urls: url(r'^edit_book/(d+)', views.edit_book,name='edit_book'), views: def edit_book(request,n): if request.method=='GET': res=models.Book.objects.get(pk=n) return render(request,'edit_book.html' ,{'res':res}) else: book_info_dict=request.POST.dict() print(book_info_dict) del book_info_dict['csrfmiddlewaretoken'] models.Book.objects.filter(pk=n).update(**book_info_dict) return redirect('show_books') #如果为get模式请求,则自动推送edit_book.html文件,如果为post请求,则将表单里的内容数据提取出来,找到数据库对应的行数据进行替换,替换完成后进行跳转到show_books网页中去