一、从数据库读取图书数据并渲染出来

1)app1/views.py函数books编写

【1】从模型下导入bookinfo信息

【2】从数据库获取图书对象列表

【3】把获取到的图书对象赋值给books键。【注意】键'books'必须要加引号

  1. from django.shortcuts import render
  2. from app1.models import BookInfo #【1】从模型下导入bookinfo信息
  3. # app1应用首页
  4. def index(request):
  5. context={} #定义1个字典
  6. context['hello']='hello world!!!' #向字典写一个键:值(hello:'hello world!!')
  7. context['wa']='wawawawawahahahaha!'
  8. context['list']=list(range(1,10)) #定义一个字典值为一个列表,list为把内容转换为列表
  9. return render(request,'app1/index.html',context) #返回:把context渲染到app1/index.html的模板文件
  10. # app1应用图书页
  11. def books(request):
  12. books=BookInfo.objects.all()#【2】从数据库获取图书对象列表
  13. return render(request,'app1/book.html',{'books':books})#【3】把获取到的图书对象赋值给books键。【注意】键'books'必须要加引号

2)app1/urls.py配置

【1】引入views

【2】books应用配置

  1. from django.urls import path
  2. from . import views #【1】引入views
  3. urlpatterns=[
  4. path('app1/',views.index),
  5. path('books/',views.books),#【2books应用配置
  6. ]

3)templates/app1/book.html模析创建编写

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>书籍页面</title>
  6. </head>
  7. <body>
  8. 本站的图书有:
  9. <ul>
  10. {% for book in books %}
  11. <li>{{book.btitle}}:{{book.bpub_date}}</li>
  12. {%empty%}
  13. 暂时没有图书!!!
  14. {% endfor %}
  15. </ul>
  16. </body>
  17. </html>

效果:http://127.0.0.1:8000/books/

本站的图书有:

天龙八部:1991年1月2日

射雕英雄传:2020年1月2日

二、通过url传参,访问书英雄详情

1)加带参数的链接/templates/app1/book.html

【1】通过href属性,把book的id做为参数传给详情页,进而查询对应英雄信息

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>书籍页面</title>
  6. </head>
  7. <body>
  8. 本站的图书有:
  9. <ul>
  10. {% for book in books %}
  11. <!--【1】通过href属性,把book的id做为参数传给详情页,进而查询对应英雄信息-->
  12. <li><a href="/detail/{{book.id}}"> {{book.btitle}}</a>:{{book.bpub_date}}</li>
  13. {%empty%}
  14. 暂时没有图书!!!
  15. {% endfor %}
  16. </ul>
  17. </body>
  18. </html>

2)接收参数,渲染到模板app1/views.py

【1】查询主键为url中传过来的参数Id。或写成:id=bookId

【2】关联查询:查询对应书的所有英雄信息

【3】把参数渲染到detail页面去

  1. from django.shortcuts import render
  2. from app1.models import BookInfo #【0】从模型下导入bookinfo数据模型
  3. def index(request):
  4. '''app1应用:首页'''
  5. context={} #定义1个字典
  6. context['hello']='hello world!!!' #向字典写一个键:值(hello:'hello world!!')
  7. context['wa']='wawawawawahahahaha!'
  8. context['list']=list(range(1,10)) #定义一个字典值为一个列表,list为把内容转换为列表
  9. return render(request,'app1/index.html',context) #返回:把context渲染到app1/index.html的模板文件
  10. def books(request):
  11. '''app1应用:图书列表页'''
  12. books=BookInfo.objects.all()#从数据库获取图书对象列表
  13. return render(request,'app1/book.html',{'books':books})#把获取到的图书对象赋值给books键。【注意】键'books'必须要加引号
  14. def detail(request,bookId):# bookId为接收urls.py中指定的参数,来源页templates/app1/book.html
  15. '''app1应用:图书详情页,显示英雄信息'''
  16. book=BookInfo.objects.get(pk=bookId) #【1】查询主键为url中传过来的参数Id。或写成:id=bookId
  17. heros=book.heroinfo_set.all() #【2】关联查询:查询对应书的所有英雄信息
  18. return render(request,'app1/detail.html',{'book':book,'heros':heros}) #【3】把参数渲染到detail页面去

3) 配置url及传参形式 app1/urls.py

【书详情页】,通过url接收参数2种写法以下两种都可

  1. from django.urls import path,re_path
  2. from . import views
  3. urlpatterns=[
  4. path('app1/',views.index),
  5. path('books/',views.books),
  6. # 【书详情页】,通过url接收参数2种写法以下两种都可:
  7. # path(r"detail/<int:bookId>",views.detail), #参数用尖括号包起来<>
  8. re_path(r"^detail/(\d+)",views.detail), #参数必须要带括号
  9. ]

4)详情模板 templates/app1/detail.html

【1】如果数据为空则执行如下代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>图书详情页,英雄信息</title>
  6. </head>
  7. <body>
  8. {{book.btitle}}的英雄有:
  9. <ul>
  10. {% for hero in heros %}
  11. <li>{{hero.hname}}:{{hero.hcomment}}</li>
  12. {%empty%}<!--【1】如果数据为空则执行如下代码-->
  13. <li>暂时没有英雄信息!!</li>
  14. {% endfor %}
  15. </ul>
  16. </body>
  17. </html>

5.附件)project1/models.py

表来源此处

  1. from django.db import models
  2. # 设计和表对应的类,模型类
  3. # 一类
  4. # 图书类
  5. class BookInfo(models.Model):
  6. '''图书模型类'''
  7. # 图书名称,CharField说明是一个字符串,max_length指定字符串的最大长度
  8. btitle = models.CharField(max_length=20)
  9. # 出版日期,DateField说明是一个日期类型
  10. bpub_date = models.DateField()
  11. def __str__(self): #重定义系统的str方法,让它返回对应图书的名字
  12. return self.btitle
  13. # 多类
  14. # 英雄人物类
  15. # 英雄名 hname
  16. # 性别 hgender
  17. # 年龄 hage
  18. # 备注 hcomment
  19. # 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
  20. class HeroInfo(models.Model):
  21. '''英雄人物模型类'''
  22. hname = models.CharField(max_length=20) # 英雄名称
  23. # 性别,BooleanField说明是bool类型,default指定默认值,False代表男
  24. hgender = models.BooleanField(default=False)
  25. # 备注
  26. hcomment = models.CharField(max_length=128)
  27. # 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
  28. # 关系属性对应的表的字段名格式: 关系属性名_id
  29. hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE) #对应BookInfo表的主键ID
  30. def __str__(self): #返回英雄名
  31. return self.hname

效果:点书列表 http://127.0.0.1:8000/books/

进入英雄详情:http://127.0.0.1:8000/detail/3

英雄为空,在localhost:8000/admin新加一个书《笑傲江湖》,但不要加英雄信息,book页再点进去后:http://127.0.0.1:8000/detail/4

Django(五)1 - 4章实战:从数据库读取图书列表并渲染出来、通过url传参urls.py path,re_path通过url传参设置、模板语法的更多相关文章

  1. Django学习笔记(3)——表单,测试和模板语法的学习

    一,表单form 为了接收用户的投票选择,我们需要在前段页面显示一个投票界面,让我们重写之前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...

  2. 初学coreData数据库读取不成功的问题

    写了一个从数据库读取数据显示列表的代码,结果却无法运行,提示找不到对应的entity,也就是数据库中的某一个表 我查遍了代码也没有发现什么逻辑错误,在appDelegate也初始化了相关数据库,在界面 ...

  3. Django框架——基础之路由系统(urls.py)

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  4. Django框架——基础之路由系统(urls.py)11111111

    1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...

  5. Django之urls.py路由配置(URLConf)

    urls.py路由配置(URLConf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 基本格式: Django1.x版本 ...

  6. Django学习笔记第九篇--实战练习五--关于数据的改、删操作、数据库字段属性的设置和类视图

    一.首先上代码.关于类视图: class register(View): #template_name = "templates/register.html" def get(se ...

  7. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

    上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...

  8. 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了如何扩展Ocelot网关,并实现数据库存储,然后测试了网关的路由功能,一切都是那么顺利,但是有一个问题未解决,就是如果网关 ...

  9. Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

    1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...

随机推荐

  1. Java基础 -4

    IF分支结构 在程序开发的过程中 一共会存在有三组程序逻辑:顺序结构.分支结构.循环结构 if分支结构主要是针对关系表达式进行判断处理的分支操作. if判断 public static void ma ...

  2. rails work

    4.2 Say "Hello", Rails problem weppack not install solve run the command rails webpacker:i ...

  3. 使用 TestFight 构建 Beta 测试版本

    ---恢复内容开始--- Beta测试属于软件开发周期中的一环,测试的重点就是让一些活生生的人去使用你的App,不断测试然后反馈.你需要让你的测试成员发现尽可能多的bug,以便你在公开发布之前将其修复 ...

  4. 「Luogu P1383 高级打字机」

    一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...

  5. python生成器三元表达式

    使用yield返回  例如: def test(): yield 1 yield 2 yield 3 yield 4 v = test() print(v.__next__()) print(v.__ ...

  6. Altium Designer中,将多个工程下的原理图和PCB合并在一起

    TDD双向放大器的设计分为三部分:LNA部分.PA部分和控制开关部分.为了调试方便,已经在三个Altium工程里面分别设计了三部分.现在需要合并成一个板子,为了保留已有的布局布线的工作量,采用这个办法 ...

  7. freeswitch install

    https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:用于要弹出信息的按钮

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Nginx 不区分大小写

    location ~* .*\.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {       #         slowfs_cache    fastca ...

  10. java中的 RSA加密

    package com.cn.test.rsa; import java.math.BigInteger; import java.security.KeyFactory; import java.s ...