编码之前的准备工作:
- 设计出访问页面的url和对应的视图函数的名字,确定视图函数的功能
- 设计模板文件的名字
以下为案例中的简单设计过程:
1、完成图书信息的展示
- 设计url,通过浏览器访问 http://127.0.0.1:8000/books,显示图书信息
- 设计url对应的视图函数show_books,查询出所有图书的信息,将这些信息传递给模板文件
- 编写模板文件show_books.html,遍历显示出每一本图书的信息。
2、完成点击某本图书时,显示出图书里所有英雄信息的页面
- 设计url,通过访问http://127.0.0.1:8000/数字,显示对应的英雄信息页面,这里数字指点击的图书的id
- 设计对应的视图函数detail,接收图书的id,根据id查询出相应的图书信息,然后查询出图书中的所有英雄信息
- 编写模板文件detail.html
示例代码:
booktest/urls.py
# -*- coding: utf-8 -*-
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^books$', views.show_books), # 显示图书信息
url(r'^books/(\d+)$', views.hero_detail) # 显示英雄信息
]
booktest/views.py
from django.shortcuts import render
from booktest.models import BookInfo, HeroInfo
def show_books(request):
"""显示图书的信息"""
# 1、通过M查找图书表中的数据
book_list = BookInfo.objects.all()
# 2、使用模版
return render(request, 'booktest/show_books.html', {"book_list": book_list})
def hero_detail(request, b_id):
"""查询图书关联的英雄信息"""
# 1,根据b_id查询图书信息
book = BookInfo.objects.get(id=b_id)
# 2, 查询和book关联的英雄信息
hero_list = book.heroinfo_set.all()
# 3, 使用模版
return render(request, 'booktest/hero_detail.html', {'hero_list': hero_list, 'book': book})
templates/booktest/show_books.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示图书信息</title>
</head>
<body>
图书信息如下:
<ul>
{#遍历图书列表#}
{% for book in book_list %}
<li>
{#输出图书名称,并设置超链接,链接地址是一个数字#}
<a href="books/{{ book.id }}">{{ book.b_title }}</a>
</li>
{% endfor %}
</ul>
</body>
</html>
templates/booktest/hero_detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示图书关联的英雄信息</title>
</head>
<body>
{#输出图书标题#}
<h1>{{ book.b_title }}</h1>
英雄信息如下:<br>
<ul>
{#遍历英雄并显示#}
{% for hero in hero_list %}
<li>
{{ hero.h_name }} ------ {{ hero.h_comment }}
</li>
{% empty %}
没有英雄信息
{% endfor %}
</body>
</html>
效果展示