django进阶-小实例
前言: 这篇博客对上篇博客django进阶作下补充。
一、效果图
前端界面较简单(丑),有两个功能:
- 从数据库中取出书名 eg: 新书A
- 在form表单输入书名,选择出版社,选择作者(多选),输入完毕后一点击创建新书submit,就在数据库创建数据
二、实现
我们先来实现第一个功能,根据数据库数据在页面打印出书名。
1. 添加url路由
1 | url(r '^book/' , views.book), |
2. 在views.py定义book方法
django默认使用GET方式,即获取数据;如果想创建/修改数据,比如待会要实现的第二个功能,就需要用POST方式。
1 2 3 4 5 6 7 8 9 | def book(request): books = models.Book.objects. all () #找到所有的书 publisher_list = models.Publisher.objects. all () author_list = models.Author.objects. all () print ( "---->:" , request) return render(request, "app01/book.html" , { "books" :books, "publishers" :publisher_list, "authors" :author_list}) |
3. 在templates/app01下创建book.html:
books为数据库中所有书的对象集合,在html用个循环便可在前端页面显示书名。
1 <h2>书列表:</h2>
2 <ul>
3 {% for book in books %}
4 <li>{{ book.name }}</li>
5 {% endfor %}
6 </ul>
接下来实现第二个功能,创建数据。
先来看前端的html:
1 <form method="post" action="/payment/book/"> {% csrf_token %} 2 book name:<input type="text" name="name"/> 3 <select name="publisher_id"> 4 {% for publisher in publishers %} 5 <option value="{{ publisher.id }}">{{ publisher.name }}</option> 6 {% endfor %} 7 </select> 8 <select name="author_ids" multiple="multiple"> 9 {% for author in authors %} 10 <option value="{{ author.id }}">{{ author.first_name }}</option> 11 {% endfor %} 12 </select> 13 <div> 14 <input type="submit" value="创建新书"/> 15 </div> 16 </form>
注意:
- 因为是创建数据,所以提交方式要用post, action="/payment/book/"是一条url, 表示将数据提交到book方法,数据封装在request参数。
- 你在选择出版社时,要将出版社名传到后台?? 其实完全不用,你只要将选中id传到后台就可以了。因此我在option标签加上value属性,用来获致出版社的id, 当你一点击submit提交数据时,value中的id会提交给select标签的name属性,name属性再将数据提交到后台。
- 你会发现html代码第一行有{% csrf_token %},这个是什么意思我现在还不知道~_~,我将这句代码去掉会提交不了数据!!
再来看后台book方法
1 def book(request):
2 if request.method == "POST": #若是创建书的数据
3 print(request.POST)
4 book_name = request.POST.get("name")
5 publisher_id = request.POST.get("publisher_id")
6 # 即使在前端页面选择多个作者只会返回一个值,只能取到最后一个作者的id
7 #author_ids = request.POST.get("author_ids")
8 author_ids = request.POST.getlist("author_ids") #getlist 可取出所有作者的id
9
10 #生成一个书的对象
11 new_book = models.Book(
12 name = book_name,
13 publisher_id = publisher_id,
14 publish_date = "2017-3-18"
15 )
16 new_book.save() #同步到数据库
17
18 #new_book.authors.add(1,2) 添加作者
19 new_book.authors.add(*author_ids) #author_ids为列表,需在前面加上*转化为id
20
21 print("------->>:", book_name,publisher_id,author_ids)
22
23 books = models.Book.objects.all()
24 publisher_list = models.Publisher.objects.all()
25 author_list = models.Author.objects.all()
26
27 print("---->:", request)
28 return render(request, "app01/book.html", {"books":books,
29 "publishers":publisher_list,
30 "authors":author_list})
当我在前端界面输入书名: 新书A, 选中第二个出版社,选中第2和第3个作者,为了方便看,我在后台打印出来了:
<QueryDict: {'name': ['新书A'], 'csrfmiddlewaretoken': ['V9OdHSJ10OFSq3r vI41tggns1W2VxwV'], 'publisher_id': ['2'], 'author_ids': ['2', '3']}> ------->>: 新书A 2 ['2', '3'] ---->: <WSGIRequest: POST '/payment/book/'> [18/Mar/2017 14:06:23] "POST /payment/book/ HTTP/1.1" 200 1335
根据打印结果知道author_ids是一个列表,当我为书添加作者时,用下面的代码:
1 | new_book.authors.add( * author_ids) |
为什么要在列表前加上*?不加上*是会曝错的! 加上*是为了将列表形式["2","3"]转化为作者id形式2,3。
登陆admin后台查看刚刚创建的新书A:
作者:前程明亮
出处:http://www.cnblogs.com/0zcl
文章未标明转载则为原创博客。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
出处:http://www.cnblogs.com/0zcl
文章未标明转载则为原创博客。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
1.非系统的学习也是在浪费时间
2.做一个会欣赏美,懂艺术,会艺术的技术人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?