详情请点阅读全文
一、从数据库读取图书数据并渲染出来
1)app1/views.py函数books编写
【1】从模型下导入bookinfo信息
【2】从数据库获取图书对象列表
【3】把获取到的图书对象赋值给books键。【注意】键’books’必须要加引号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from django.shortcuts import render from app1.models import BookInfo
def index(request): context={} context['hello']='hello world!!!' context['wa']='wawawawawahahahaha!' context['list']=list(range(1,10)) return render(request,'app1/index.html',context)
def books(request): books=BookInfo.objects.all() return render(request,'app1/book.html',{'books':books})
|
2)app1/urls.py配置
【1】引入views
【2】books应用配置
1 2 3 4 5 6 7
| from django.urls import path from . import views
urlpatterns=[ path('app1/',views.index), path('books/',views.books), ]
|
3)templates/app1/book.html模析创建编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>书籍页面</title> </head> <body> 本站的图书有: <ul> {% for book in books %} <li>{{book.btitle}}:{{book.bpub_date}}</li> {%empty%} 暂时没有图书!!! {% endfor %} </ul> </body> </html>
|
本站的图书有:
天龙八部:1991年1月2日
射雕英雄传:2020年1月2日
二、通过url传参,访问书英雄详情
1)加带参数的链接/templates/app1/book.html
【1】通过href属性,把book的id做为参数传给详情页,进而查询对应英雄信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>书籍页面</title> </head> <body> 本站的图书有: <ul> {% for book in books %} <!--【1】通过href属性,把book的id做为参数传给详情页,进而查询对应英雄信息--> <li><a href="/detail/{{book.id}}"> {{book.btitle}}</a>:{{book.bpub_date}}</li> {%empty%} 暂时没有图书!!! {% endfor %} </ul> </body> </html>
|
2)接收参数,渲染到模板app1/views.py
【1】查询主键为url中传过来的参数Id。或写成:id=bookId
【2】关联查询:查询对应书的所有英雄信息
【3】把参数渲染到detail页面去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from django.shortcuts import render from app1.models import BookInfo
def index(request): '''app1应用:首页''' context={} context['hello']='hello world!!!' context['wa']='wawawawawahahahaha!' context['list']=list(range(1,10)) return render(request,'app1/index.html',context)
def books(request): '''app1应用:图书列表页''' books=BookInfo.objects.all() return render(request,'app1/book.html',{'books':books})
def detail(request,bookId): '''app1应用:图书详情页,显示英雄信息''' book=BookInfo.objects.get(pk=bookId) heros=book.heroinfo_set.all() return render(request,'app1/detail.html',{'book':book,'heros':heros})
|
3) 配置url及传参形式 app1/urls.py
【书详情页】,通过url接收参数2种写法以下两种都可
1 2 3 4 5 6 7 8 9 10 11 12
| from django.urls import path,re_path from . import views
urlpatterns=[ path('app1/',views.index), path('books/',views.books),
re_path(r"^detail/(\d+)",views.detail), ]
|
4)详情模板 templates/app1/detail.html
【1】如果数据为空则执行如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书详情页,英雄信息</title> </head> <body> {{book.btitle}}的英雄有: <ul> {% for hero in heros %} <li>{{hero.hname}}:{{hero.hcomment}}</li> {%empty%}<!--【1】如果数据为空则执行如下代码--> <li>暂时没有英雄信息!!</li> {% endfor %} </ul> </body> </html>
|
5.附件)project1/models.py
表来源此处
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| from django.db import models
class BookInfo(models.Model): '''图书模型类''' btitle = models.CharField(max_length=20) bpub_date = models.DateField()
def __str__(self): return self.btitle
class HeroInfo(models.Model): '''英雄人物模型类''' hname = models.CharField(max_length=20) hgender = models.BooleanField(default=False) hcomment = models.CharField(max_length=128) hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
def __str__(self): return self.hname
|