这个作业是刚学django做的,一直没再看,所以现在才发,很多功能都没有
整个项目需要注意的点:
有空再补充(这样说的一般后来都会忘记,尴尬😅)
1.开启一个项目第一件事就是去settings看看数据库配置和静态路由,然后再检查一下各个路径配置和app有没有写进去。static需要手动去创建。
2.然后去models把表创建好,关联好,makemigrations做下迁移记录,migrate刷进数据库。如果有多对多可以去数据库查看下有没有自动帮忙创建。
3.在urls开好口子,方便浏览器访问,然后就可以去写视图函数和对应的模板。
4.视图函数注意点很多,以下一一列举:
4.1 首先要导入models ==》 from app01.models import *
4.2 定义的函数形参默认是request:request常用三个属性:method 获得请求的方式POST或者GET,也可以用于做判断。
request.POST 获得通过post请求方式发过来的请求体,可以用get对其里面属性进行取值。
request.GET获得通过GET请求方式发过来的请求
需要注意的几个点:
0.先配置好settings,数据库配置,习惯用mysql,配置好路径,配置好静态路由,csrf文件先注释掉,还有一个要注意的就是如果app不是在创建项目创建之时,
后面手动创建的app需要自己加到installed_apps.
1.先建立好他们之间的关系:作者和书多对多,书和出版社多对一
所以,我们先按照这个关系建好表,如下:

1 from django.db import models 2 3 # Create your models here. 4 class Publish(models.Model): 5 # 可以不写,默认会帮你创建 6 nid=models.AutoField(primary_key=True) 7 name=models.CharField(max_length=32) 8 addr=models.CharField(max_length=64) 9 # 也是varchar类型 10 email=models.EmailField() 11 12 class Author(models.Model): 13 nid = models.AutoField(primary_key=True) 14 name=models.CharField(max_length=32) 15 age=models.IntegerField() 16 17 class Book(models.Model): 18 nid = models.AutoField(primary_key=True) 19 name=models.CharField(max_length=32) 20 price=models.DecimalField(max_digits=5,decimal_places=2) 21 pub_date=models.DateField() 22 # to那个表,可以不加引号,但是,要在前面定义 23 publish=models.ForeignKey(to='Publish',to_field='nid') 24 authors=models.ManyToManyField(to='Author') 25 26 27 # 等同于authors=models.ManyToManyField(to='Author') 28 # 不需要额外再建一张表 29 # class Book2Author(models.Model): 30 # nid=models.AutoField(primary_key=True) 31 # book=models.ForeignKey(to='Book',to_field='nid') 32 # author=models.ForeignKey(to='Author',to_field='nid')
2.开好路由,外界访问时候先通过路由映射关系找到函数,记得导入视图模块

1 """untitled URL Configuration
2
3 The `urlpatterns` list routes URLs to views. For more information please see:
4 https://docs.djangoproject.com/en/1.11/topics/http/urls/
5 Examples:
6 Function views
7 1. Add an import: from my_app import views
8 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
9 Class-based views
10 1. Add an import: from other_app.views import Home
11 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
12 Including another URLconf
13 1. Import the include() function: from django.conf.urls import url, include
14 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
15 """
16 from django.conf.urls import url
17 from django.contrib import admin
18 from app01 import views
19 urlpatterns = [
20 url(r'^admin/', admin.site.urls),
21 url(r'^add_publish/', views.add_publish),
22 url(r'^publish_list/', views.publish_list),
23 url(r'^delete_publish/', views.delete_publish),
24 url(r'^edit_publish/', views.edit_publish),
25 url(r'^add_book/', views.add_book),
26 url(r'^book_list/', views.book_list),
27 url(r'^delete_book/', views.delete_book),
28 url(r'^edit_book/',views.edit_book),
29 url(r'^add_author/', views.add_author),
30 url(r'^author_list/', views.author_list),
31 url(r'^delete_author/', views.delete_author),
32 url(r'^edit_author/',views.edit_author),
33 ]
3.写视图函数

1 from django.shortcuts import render, HttpResponse, redirect
2 # from app01 import models
3 from app01.models import *
4
5
6 # Create your views here.
7
8
9 def add_publish(request):
10 if request.method == 'POST':
11 name = request.POST.get('name')
12 addr = request.POST.get('addr')
13 email = request.POST.get('email')
14 Publish.objects.create(name=name, addr=addr, email=email)
15 return redirect('/publish_list/')
16
17 return render(request, 'add_publish.html')
18
19
20 def publish_list(request):
21 publish_list = Publish.objects.all()
22 return render(request, 'publish_list.html', {'publish_list': publish_list})
23
24
25 def delete_publish(request):
26 nid = request.GET.get('nid')
27 print(nid)
28 # 通过fileter过滤出nid为传入的nid,删除掉
29 # 过滤出nid=2的数据
30 ret = Publish.objects.filter(nid=nid)
31 # 删除这些数据
32 ret.delete()
33 return redirect('/publish_list/')
34
35
36 def edit_publish(request):
37 if request.method == 'POST':
38 nid = request.POST.get('nid')
39 name = request.POST.get('name')
40 addr = request.POST.get('addr')
41 email = request.POST.get('email')
42 Publish.objects.filter(pk=nid).update(name=name, addr=addr, email=email)
43 return redirect('/publish_list/')
44 # 这样写的话有点局限性,必须要先获得nid
45 nid = request.GET.get('nid')
46 publish = Publish.objects.filter(nid=nid).first()
47 return render(request, 'edit_publish.html', {'publish': publish})
48
49
50 def add_book(request):
51 if request.method == 'POST':
52 name = request.POST.get('name')
53 price = request.POST.get('price')
54 pub_date = request.POST.get('pub_date')
55 publish_id = request.POST.get('publish')
56 authors = request.POST.getlist('authors')
57 book = Book.objects.create(name=name, price=price, pub_date=pub_date, publish_id=publish_id)
58 # for i in authors:
59 # book.authors.add(i)
60 # 它会去中间表(book_authors),添加记录
61 book.authors.add(*authors)
62
63 return redirect('/book_list/')
64 publish_list = Publish.objects.all()
65 author_list = Author.objects.all()
66 return render(request, 'add_book.html', {'publish_list': publish_list, 'author_list': author_list})
67
68
69 def book_list(request):
70 book_list = Book.objects.all()
71
72 return render(request, 'book_list.html', {'book_list': book_list})
73
74
75 def delete_book(request):
76 nid = request.GET.get('nid')
77 Book.objects.filter(pk=nid).delete()
78 return redirect('/book_list/')
79
80
81 def edit_book(request):
82 if request.method == 'POST':
83 nid = request.POST.get('nid')
84 name = request.POST.get('name')
85 price = request.POST.get('price')
86 pub_date = request.POST.get('pub_date')
87 publish_id = request.POST.get('publish')
88 authors = request.POST.getlist('authors')
89 Book.objects.filter(pk=nid).update(name=name, price=price, pub_date=pub_date, publish_id=publish_id)
90 book = Book.objects.filter(pk=nid).first()
91 book.authors.set(authors)
92
93 return redirect('/book_list/')
94 nid = request.GET.get('nid')
95 book = Book.objects.filter(pk=nid).first()
96 author_list = Author.objects.all()
97 publish_list = Publish.objects.all()
98 return render(request,'edit_book.html',{'book':book,'publish_list':publish_list,'author_list':author_list})
99
100
101 def author_list(request):
102 author_list = Author.objects.all()
103 return render(request, 'author_list.html', {'author_list': author_list})
104
105
106 def add_author(request):
107 if request.method == 'POST':
108 name = request.POST.get('name')
109 age = request.POST.get('age')
110 Author.objects.create(name=name, age=age)
111 return redirect('/author_list/')
112
113 return render(request, 'add_author.html')
114
115
116 def delete_author(request):
117 nid = request.GET.get('nid')
118 Author.objects.filter(pk=nid).delete()
119 return redirect('/author_list/')
120
121
122 def edit_author(request):
123 if request.method == 'POST':
124 nid = request.POST.get('nid')
125 name = request.POST.get('name')
126 age = request.POST.get('age')
127
128 Author.objects.filter(pk=nid).update(name=name, age=age)
129 return redirect('/author_list/')
130 nid = request.GET.get('nid')
131 author = Author.objects.filter(pk=nid).first()
132 return render(request, 'edit_author.html', {'author': author})
4.视图函数需要调用模板,并且有的需要调用数据库中的数据来对模板进行渲染
下面是本次用到的9个模板
作者相关联的表

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>作者列表</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>出版社列表</h2>
13 <table class="table table-condensed">
14 <thead>
15 <tr>
16 <th>ID</th>
17 <th>作者姓名</th>
18 <th>作者年龄</th>
19 </tr>
20 </thead>
21 <tbody>
22 {% for author in author_list %}
23 <tr>
24 <td>{{ forloop.counter }}</td>
25 <td>{{ author.name}}</td>
26 <td>{{ author.age }}</td>
27 <td>
28 <a href="/delete_author/?nid={{ author.nid }}" class="btn btn-danger">删除</a>
29 <a href="/edit_author/?nid={{ author.nid }}" class="btn btn-success">编辑</a>
30 </td>
31 </tr>
32 {% endfor %}
33 </tbody>
34 </table>
35 </div>
36 </div>
37 </div>
38 </body>
39 </html>

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>添加作者</title> 6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> 7 8 </head> 9 <body> 10 <div class="container"> 11 <div class="row"> 12 <div class="col-md-6 col-md-offset-3"> 13 <h2>添加作者</h2> 14 <form action="/add_author/" method="post"> 15 <p>作者姓名:<input type="text" name="name" class="form-control"></p> 16 <p>作者年龄:<input type="text" name="age" class="form-control"></p> 17 <p><input type="submit" value="添加" class="form-control btn btn-success"></p> 18 </form> 19 </div> 20 </div> 21 </div> 22 23 </body> 24 </html>

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>修改作者</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>修改作者</h2>
13 <form action="/edit_author/" method="post">
14 <input type="hidden" name="nid" class="form-control" value="{{ author.nid }}">
15 <p>作者姓名:<input type="text" name="name" class="form-control" value="{{ author.name }}"></p>
16 <p>作者年龄:<input type="text" name="age" class="form-control" value="{{ author.age }}"></p>
17 <p><input type="submit" value="修改" class="form-control btn btn-success"></p>
18
19
20 </form>
21 <form action=""></form>
22
23 </div>
24 </div>
25 </div>
26 </body>
27 </html>
出版社相关联的表

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
6 <title>出版社列表</title>
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>出版社列表</h2>
13 <table class="table table-condensed">
14 <thead>
15 <tr>
16 <th>ID</th>
17 <th>出版社名称</th>
18 <th>出版社地址</th>
19 <th>邮箱</th>
20 <th>操作</th>
21 </tr>
22 </thead>
23 <tbody>
24 {% for publish in publish_list %}
25 <tr>
26 <td>{{ forloop.counter }}</td>
27 <td>{{ publish.name}}</td>
28 <td>{{ publish.addr }}</td>
29 <td>{{ publish.email }}</td>
30 <td>
31 <a href="/delete_publish/?nid={{ publish.nid }}" class="btn btn-danger">删除</a>
32 <a href="/edit_publish/?nid={{ publish.nid }}" class="btn btn-success">编辑</a>
33 </td>
34 </tr>
35
36 {% endfor %}
37
38 </tbody>
39 </table>
40
41
42 </div>
43 </div>
44 </div>
45 </body>
46 </html>

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>新增出版社</title> 6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> 7 </head> 8 <body> 9 10 <div class="container"> 11 <div class="row"> 12 <div class="col-md-6 col-md-offset-3"> 13 <h2>添加出版社</h2> 14 <form action="/add_publish/" method="post"> 15 <p>出版社名称:<input type="text" name="name" class="form-control"></p> 16 <p>出版社地址:<input type="text" name="addr" class="form-control"></p> 17 <p>出版社邮箱:<input type="text" name="email" class="form-control"></p> 18 <p><input type="submit" value="添加" class="form-control btn btn-success"></p> 19 20 21 22 </form> 23 24 </div> 25 </div> 26 </div> 27 28 </body> 29 </html>

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>修改出版社</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9
10
11 <div class="container">
12 <div class="row">
13 <div class="col-md-6 col-md-offset-3">
14 <h2>修改出版社</h2>
15 <form action="/edit_publish/" method="post">
16 <input type="hidden" name="nid" class="form-control" value="{{ publish.nid }}">
17 <p>出版社名称:<input type="text" name="name" class="form-control" value="{{ publish.name }}"></p>
18 <p>出版社地址:<input type="text" name="addr" class="form-control" value="{{ publish.addr }}"></p>
19 <p>出版社邮箱:<input type="text" name="email" class="form-control" value="{{ publish.email }}"></p>
20 <p><input type="submit" value="修改" class="form-control btn btn-success"></p>
21
22
23 </form>
24
25 </div>
26 </div>
27 </div>
28 </body>
29 </html>
书籍相关联的表

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>图书列表</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>图书列表</h2>
13 <table class="table table-condensed">
14 <thead>
15 <tr>
16 <th>ID</th>
17 <th>书名</th>
18 <th>价格</th>
19 <th>出版日期</th>
20 <th>出版社名称</th>
21 <th>作者</th>
22 <th>操作</th>
23 </tr>
24 </thead>
25 <tbody>
26 {% for book in book_list %}
27 <tr>
28 <td>{{ forloop.counter }}</td>
29 <td>{{ book.name}}</td>
30 <td>{{ book.price }}</td>
31 <td>{{ book.pub_date|date:'Y-m-d' }}</td>
32 <td>{{ book.publish.name }}</td>
33 <td>
34 {% for author in book.authors.all %}
35 {{ author.name }}|
36 {% endfor %}
37
38 </td>
39
40 <td>
41 <a href="/delete_book/?nid={{ book.nid }}" class="btn btn-danger">删除</a>
42 <a href="/edit_book/?nid={{ book.nid }}" class="btn btn-success">编辑</a>
43 </td>
44 </tr>
45
46 {% endfor %}
47
48 </tbody>
49 </table>
50
51
52 </div>
53 </div>
54 </div>
55
56
57 </body>
58 </html>

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>新增图书</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>新增图书</h2>
13 <form action="/add_book/" method="post">
14 <input type="hidden" name="nid" class="form-control" value="{{ publish.nid }}">
15 <p>图书名称:<input type="text" name="name" class="form-control"></p>
16 <p>价格:<input type="text" name="price" class="form-control" ></p>
17 <p>出版日期:<input type="date" name="pub_date" class="form-control"></p>
18 <p>出版社:
19 <select name="publish" id="" class="form-control">
20 {% for publish in publish_list %}
21 <option value="{{ publish.nid }}">{{ publish.name }}</option>
22 {% endfor %}
23 </select>
24 </p>
25 <p>作者:
26 <select name="authors" id="" multiple class="form-control">
27 {% for author in author_list %}
28 <option value="{{ author.nid }}">{{ author.name }}</option>
29
30 {% endfor %}
31
32
33 </select>
34
35 </p>
36
37
38 <p><input type="submit" value="提交" class="form-control btn btn-success"></p>
39
40
41 </form>
42
43 </div>
44 </div>
45 </div>
46 </body>
47 </html>

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>编辑书籍</title>
6 <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
7 </head>
8 <body>
9 <div class="container">
10 <div class="row">
11 <div class="col-md-6 col-md-offset-3">
12 <h2>修改书籍</h2>
13 <form action='/edit_book/' method="post">
14 <input type="hidden" name="nid" class="form-control" value="{{ book.nid }}">
15 <p>书籍名称:<input type="text" name="name" class="form-control" value="{{ book.name }}"></p>
16 <p>书籍价格:<input type="text" name="price" class="form-control" value="{{ book.price }}"></p>
17 <p>出版日期:<input type="date" name="pub_date" class="form-control" value="{{ book.pub_date|date:'Y-m-d'}}"></p>
18 <p>出版社:
19 <select name="publish" id="" class="form-control">
20 {% for publish in publish_list %}
21 {% if book.publish == publish %}
22 <option selected value="{{ publish.nid }}">{{ publish.name }}</option>
23 {% else %}
24 <option value="{{ publish.nid }}">{{ publish.name }}</option>
25 {% endif %}
26
27 {% endfor %}
28 </select>
29 </p>
30 <p>作者:
31 <select name="authors" id="" multiple class="form-control">
32 {% for author in author_list %}
33 {% if author in book.authors.all %}
34 <option selected value="{{ author.nid }}">{{ author.name }}</option>
35 {% else %}
36 <option value="{{ author.nid }}">{{ author.name }}</option>
37 {% endif %}
38 {% endfor %}
39 </select>
40 </p>
41 <p><input type="submit" value="修改" class="form-control btn btn-success"></p>
42
43
44 </form>
45
46 </div>
47 </div>
48 </div>
49
50 </body>
51 </html>
来源:https://www.cnblogs.com/Roc-Atlantis/p/9579669.html
