最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

django进阶学习记录

来源:懂视网 责编:小采 时间:2020-11-27 14:16:17
文档

django进阶学习记录

django进阶学习记录:前言: 这篇博客对上篇博客django进阶作下补充。一、效果图前端界面较简单(丑),有两个功能:从数据库中取出书名 eg: 新书A在form表单输入书名,选择出版社,选择作者(多选),输入完毕后一点击创建新书submit,就在数据库创建数据 二、实现我们先来实现第一个
推荐度:
导读django进阶学习记录:前言: 这篇博客对上篇博客django进阶作下补充。一、效果图前端界面较简单(丑),有两个功能:从数据库中取出书名 eg: 新书A在form表单输入书名,选择出版社,选择作者(多选),输入完毕后一点击创建新书submit,就在数据库创建数据 二、实现我们先来实现第一个
前言: 这篇博客对上篇博客django进阶作下补充。

一、效果图

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进阶学习记录

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    django进阶学习记录

    django进阶学习记录:前言: 这篇博客对上篇博客django进阶作下补充。一、效果图前端界面较简单(丑),有两个功能:从数据库中取出书名 eg: 新书A在form表单输入书名,选择出版社,选择作者(多选),输入完毕后一点击创建新书submit,就在数据库创建数据 二、实现我们先来实现第一个
    推荐度:
    标签: 记录 内容 进阶
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top