前言: 这篇博客对上篇博客django进阶作下补充。

一、效果图

前端界面较简单(丑),有两个功能:

  • 从数据库中取出书名 eg: 新书A
  • 在form表单输入书名,选择出版社,选择作者(多选),输入完毕后一点击创建新书submit,就在数据库创建数据

二、实现

我们先来实现第一个功能,根据数据库数据在页面打印出书名。

1. 添加url路由

    url(r'^book/', views.book),

2. 在views.py定义book方法

django默认使用GET方式,即获取数据;如果想创建/修改数据,比如待会要实现的第二个功能,就需要用POST方式。

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用个循环便可在前端页面显示书名。

     <h2>书列表:</h2>
<ul>
{% for book in books %}
<li>{{ book.name }}</li>
{% endfor %}
</ul>

接下来实现第二个功能,创建数据。

先来看前端的html:

     <form method="post" action="/payment/book/"> {% csrf_token %}
book name:<input type="text" name="name"/>
<select name="publisher_id">
{% for publisher in publishers %}
<option value="{{ publisher.id }}">{{ publisher.name }}</option>
{% endfor %}
</select>
<select name="author_ids" multiple="multiple">
{% for author in authors %}
<option value="{{ author.id }}">{{ author.first_name }}</option>
{% endfor %}
</select>
<div>
<input type="submit" value="创建新书"/>
</div>
</form>

注意:

  • 因为是创建数据,所以提交方式要用post, action="/payment/book/"是一条url, 表示将数据提交到book方法,数据封装在request参数。
  • 你在选择出版社时,要将出版社名传到后台?? 其实完全不用,你只要将选中id传到后台就可以了。因此我在option标签加上value属性,用来获致出版社的id, 当你一点击submit提交数据时,value中的id会提交给select标签的name属性,name属性再将数据提交到后台。
  • 你会发现html代码第一行有{% csrf_token %},这个是什么意思我现在还不知道~_~,我将这句代码去掉会提交不了数据!!

再来看后台book方法

 def book(request):
if request.method == "POST": #若是创建书的数据
print(request.POST)
book_name = request.POST.get("name")
publisher_id = request.POST.get("publisher_id")
# 即使在前端页面选择多个作者只会返回一个值,只能取到最后一个作者的id
#author_ids = request.POST.get("author_ids")
author_ids = request.POST.getlist("author_ids") #getlist 可取出所有作者的id #生成一个书的对象
new_book = models.Book(
name = book_name,
publisher_id = publisher_id,
publish_date = "2017-3-18"
)
new_book.save() #同步到数据库 #new_book.authors.add(1,2) 添加作者
new_book.authors.add(*author_ids) #author_ids为列表,需在前面加上*转化为id print("------->>:", book_name,publisher_id,author_ids) 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})

当我在前端界面输入书名: 新书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是一个列表,当我为书添加作者时,用下面的代码:

new_book.authors.add(*author_ids)

为什么要在列表前加上*?不加上*是会曝错的! 加上*是为了将列表形式["2","3"]转化为作者id形式2,3。

登陆admin后台查看刚刚创建的新书A:

django进阶-小实例的更多相关文章

  1. Python自学笔记-Django分页器小实例

    from django.core.paginator import Paginator iter = 'abcdefhijklmnopqw' paginator = Paginator(iter,4) ...

  2. Django ModelForm 小实例1

    1.models.py ASSET_STATUS = ( (str(1), u"使用中"), (str(2), u"未使用"), (str(3), u" ...

  3. django Form 表单 总结与小实例

    开头寄语: 这几天一直在看Django的form表单验证,然后想对于这几天要有个总结. 首先,先来看一下找到的一个form表单验证的流程: 验证过程 流程详解1. 函数full_clean()依次调用 ...

  4. js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^)

    js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^) 一.总结 原样匹配的字符在正则中原样输出:var reg4=/第[1-2][0-9]章/g //10-29 取反^:var ...

  5. Django 小实例S1 简易学生选课管理系统 12 CSS样式完善

    Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...

  6. Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现

    Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...

  7. Django 小实例S1 简易学生选课管理系统 10 老师课程业务实现

    Django 小实例S1 简易学生选课管理系统 第10节--老师课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,老师将要使 ...

  8. Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)

    Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...

  9. Django 小实例S1 简易学生选课管理系统 8 CSS样式优化

    Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...

随机推荐

  1. vs2015配置mysql数据库时,mysql.data、mysql.data.entity、EntityFramework的安装错误问题

    vs2015连接mysql数据库常见问题 最近在vs2015用asp.net开发一个网站,要连接mysql数据库,于是百度了一下相关配置的文章,有好几篇文章说了相关步骤,但是我装的时候还是遇到了问题, ...

  2. C# IEnumerator的使用

    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素而 ...

  3. javapms部署之后首页不能正常显示问题

    今天在ligerui的技术群里看见了javapms,于是就到官网逛了逛 首先要做的就是了解了javapms使用到的技术 然后下载了程序安装包javapms_v1.1_beta(官网下载失败了,就bai ...

  4. Python内部机制。

    type ,object ,__class__ ,__bases__ ,__metaclass__ , -------------------------不明白的地方----------------- ...

  5. rrnDB数据库简介-16S基因多拷贝数的证据

    16S基因作为mark gene在微生物群落结构的研究中发挥中重要作用, 但是候选的mark gene 肯定不止16S 一种,最新比较火热的功能基因,也可以作为mark gene.利用功能基因作为ma ...

  6. ORA-01033错误解决方案

    现象:SQL*Plus无法连接,显示以下错误: ORA-01033 : ORACLE initialization or shutdown in progress 分析:应该是Oracle在启动后,用 ...

  7. php base64_encode,serialize对于存入数据表中字段的数据处理方案

    A better way to save to Database $toDatabse = base64_encode(serialize($data)); // Save to database $ ...

  8. springboot - Constructor、@Autowired、@PostConstruct分析

    1.Constructor 构造方法 2.@Autowired 依赖注入 3.@PostConstruct 在依赖注入完成后被自动调用 4. 三者的顺序: 从依赖注入的字面意思就可以知道,要将对象p注 ...

  9. Hbuilder MUI里面使用java.net.URL发送网络请求,操作cookie

    1. 引入所需网络请求类: var URL = plus.android.importClass("java.net.URL"); var URLConnection = plus ...

  10. Macbook pro安装MacOS系统

    在app store 下载系统sierra; 打开磁盘工具,选择优盘,抹掉: 日志式,GUID分区: http://www.cnblogs.com/xiaobo-Linux/ 终端输入命令, sudo ...