第一步:
建立表然后执行迁移命令:
from django.db import models class Book(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) create_time = models.DateField(auto_now_add=True) # 外键建在多的那一方 publish = models.ForeignKey(to='Publish') # 多对多不会成为字段,只是绑定一种关系,建立在使用频率高的那一方 authors = models.ManyToManyField(to='Author') class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) email = models.EmailField() class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() # 一对一关系的建立 authordetail = models.OneToOneField(to='AuthorDetail') class AuthorDetail(models.Model): addr = models.CharField(max_length=32) phone = models.IntegerField()
第二步:
定义home主页,并且将home作为父模板,在巨幕那里用block框起来,导航,左列表,面板固定不变,子模板只需要重写父模板
巨幕:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Brand</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> <li role="separator" class="divider"></li> <li><a href="#">One more separated link</a></li> </ul> </li> </ul> <form class="navbar-form navbar-left"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <div class="container"> <div class="row"> <div class="col-md-3"> <div class="list-group"> <a href="#" class="list-group-item active"> 图书管理系统 </a> <a href="/booklist/" class="list-group-item">图书信息</a> <a href="#" class="list-group-item">出版社信息</a> <a href="#" class="list-group-item">作者信息</a> <a href="#" class="list-group-item">Vestibulum at eros</a> </div> </div> <div class="col-md-9"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">Panel title</h3> </div> <div class="panel-body"> {# 把这里作为子模板重写的地方 #} {% block content %} <div class="jumbotron"> <h1>Hello, world!</h1> <p>...</p> <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p> </div> {% endblock %} </div> </div> </div> </div> </div> </body> </html
第三步:
我们点击图书列表的时候,我们需要给用户展示一个图书信息的页面,图书列表的那个a标签路径定义为/booklist/,然后去路由写下booklist,在写下相应的视图函数,我们将数据库所有的图书取出来,在前端for循环,然后得到每个对象,通过对象点属性,得到图书的信息,通过teble标签展示给用户,代码如下:
def booklist(request): book_list = models.Book.objects.all() return render(request, 'booklist.html', locals())
{% extends 'home.html' %} {% block content %} <a href="/addbook/" class="btn bg-primary text-center">添加数据</a> <table class="table table-striped table-hover table-bordered"> <thead> <tr> <th>id</th> <th>书名</th> <th>价格</th> <th>出版日期</th> <th>出版社</th> <th>作者</th> <th>操作</th> </tr> </thead> <tbody> {% for book in book_list %} <tr> <td>{{ book.pk }}</td> <td>{{ book.name }}</td> <td>{{ book.price }}</td> <td>{{ book.create_time }}</td> <td>{{ book.publish.name }}</td> <td> {% for author in book.authors.all %} {% if forloop.last %} {{ author.name }} {% else %} {{ author.name }}, {% endif %} {% endfor %} </td> <td> <a href="/edit/{{ book.pk }}/" class="btn bg-success">编辑</a> <a href="/delect/{{ book.pk }}/" class="btn btn-danger">删除</a> </td> </tr> {% endfor %} </tbody> </table> {% endblock %}
第四步:
我们设置增加数据,编辑,删除三个a标签,首先添加数据,我们第一步在添加数据的a标签写下addbook的路径,再去路由和视图写下匹配
的路由和函数,再去templates文件夹写下addbook.html,首先写一个form表单,POST提交方式,出版社和作者我们写select,那么我们要
将数据库所有的出版社和作者取出来,然后写在前端,对于作者是多对多的关系,所以我们要if判断,如果是最后一个我们直接{{author.name}},不是最后一个我们需要加一个逗号,我们在后端可以通过request.POST.get()来获取我们提交的数据,然后在通过
models.Book.object.create(name=name,...)来创建一个对象,但是我们要绑定书和作者的关系,所以提交的值是publish.pk和authors.pk
前端我们通过book_obj.authors.add(authors_list_id)来绑定与作者的关系。
def addbook(request): if request.method == 'POST': name = request.POST.get('name') price = request.POST.get('price') date = request.POST.get('date') publish_id = request.POST.get('publish') authors_list_id = request.POST.getlist('authors') book_obj = models.Book.objects.create(name=name, price=price, create_time=date, publish_id=publish_id) book_obj.authors.add(*authors_list_id) return redirect('/booklist') publish_list = models.Publish.objects.all() author_list = models.Author.objects.all() return render(request, 'addbook.html', locals())
第五步,编辑数据首先要找出你要编辑书籍的id,我们可以通过无名分组,将book.pk写在编辑标签的路径,在路由匹配,分组得到book.pk,通过它我们可以获取要编辑的书籍对象,接下来我们我们写下一个form表单,通过book.obj来点属性,但是出版社我们要做判断
首先 我们取出数据库中所有的的出版社和作者,在for循环,if publish==book_obj.publish,那么我们就给他设置默认选中,至于作者那里
我们 if author in book_obj.authors.all 来做判断。
{% extends 'home.html' %} {% block content %} <h2 class="text-center">编辑数据</h2> <form action="" method="post"> 书名:<input type="text" class="form-control" name="name" value="{{ book_obj.name }}"> 价格:<input type="text" class="form-control" name="price" value="{{ book_obj.price }}"> 出版时间:<input type="date" class="form-control" name="date" value="{{ book_obj.create_time|date:'Y-m-d'}}"> <p>出版社: <select name="publish" id="" class="form-control"> {% for publish in publish_list %} {% if publish == book_obj.publish %} <option value="{{ publish.pk }}" selected>{{ publish.name }}</option> {% else %} <option value="{{ publish.pk }}" >{{ publish.name }}</option> {% endif %} {% endfor %} </select> </p> <p>作者: <select name="authors" id="" class="form-control" multiple> {% for author in author_list %} {% if author in book_obj.authors.all %} <option value="{{ author.pk }}" selected>{{ author.name }}</option> {% else %} <option value="{{ author.pk }}">{{ author.name }}</option> {% endif %} {% endfor %} </select> </p> <input type="submit" class="btn-danger pull-right"> </form> {% endblock %}
def edit(request, edit_id): # 不管什么请求都可以得到edit_id,因为get请求提交数据,分组将edit_id传过去了, # post请求的话默认向当前路径提交 book_obj = models.Book.objects.filter(id=edit_id).first() if request.method == 'POST': name = request.POST.get('name') price = request.POST.get('price') date = request.POST.get('date') publish_id = request.POST.get('publish') author_id = request.POST.get('authors') print(author_id) models.Book.objects.filter(id=edit_id).update(name=name, price=price, create_time=date, publish_id=publish_id) # 绑定书籍和作者关系 book_obj.authors.set(author_id) return redirect('/booklist') publish_list = models.Publish.objects.all() author_list = models.Author.objects.all() return render(request, 'edit.html', locals())
第六步:删除数据,根据无名分组传过去的id,直接delete()就行。