1.创建模型类:
from django.db import models
# Create your models here.
class BookInfo(models.Model):
'''图书模型类'''
title = models.CharField(max_length=20)
pub_date = models.DateField()
read = models.IntegerField(default=0)
class HeroInfo(models.Model):
# 关系属性,建立图书类和英雄类一对多关系
book = models.ForeignKey('BookInfo')
name = models.CharField(max_length=5)
# 性别采用布尔字段,默认Flase为男
gender = models.BooleanField(default=False)
comment = models.CharField(max_length=120)
2.生成迁移文件和执行迁移生成表:
python manage.py makemigrations
python manage.py migrate
3.通过模型类操作数据表:
python manage.py shell
导入模型类:
from booktest.models import BookInfo,HeroInfo
进行数据操作:
>>> b = BookInfo() # 定义一个BookInfo类的对象
>>> b.title='天龙八部' # 给title属性赋值
>>> from datetime import date
>>> b.pub_date = date(1990,10,11)
>>> b.save() # 执行这部才会将数据保存进数据库
>>> b2 = BookInfo()
>>> b2.title = '射雕英雄传'
>>> b2.pub_date = date(1991,1,1)
>>> b2.save()
>>> h = HeroInfo()
>>> h.name = '郭靖'
>>> h.gender = False
>>> h.comment = '主角,武功盖世'
>>> h.book = b2
>>> h.save()
>>> h2 = HeroInfo()
>>> h2.name = '乔峰'
>>> h2.gender = False
>>> h2.book = b
>>> h2.save()
>>> h2.comment = '男主角,厉害'
>>> h2.save
<bound method Model.save of <HeroInfo: HeroInfo object>>
>>> h2.save()
最后,可以看出数据都已添加进数据库
4.定义视图函数:
from django.shortcuts import render
from booktest import models
# Create your views here.
def show_books(request):
'''显示图书详细信息'''
# 1.从M中获取图书信息
books_info = models.BookInfo.objects.all() # 返回一个对象列表
# 2.返回数据
return render(request, 'booktest/show_books.html', {'books': books_info})
def detail(request, bid):
# 根据bid查找图书信息
book_info = models.BookInfo.objects.get(id=bid)
# 查询出book_info图书中所有的英雄人物信息
heros_info = book_info.heroinfo_set.all()
# 返回数据
return render(request, 'booktest/detail.html', {'book': book_info, 'heros': heros_info})
注意:第二行我想from booktest.models import BookInfo这样导入,但是Django会报错找不到models,所以我直接导入models。这是因为pycharm路径问题,后续找出解决方案。
5.配置urls:
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^books$', views.show_books),
url(r'^books/(\d+)$', views.detail), # 利用正则表达式分组后,django会把分组的内容当做参数传进视图函数中
]
注意:这里要利用正则表达式分组,这样django会把内容传递给视图函数中的参数,这里是传递给bid这个参数
6.创建模板文件夹,分别定义books.html和detail.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ book.title }}</h1>
英雄信息如下:<br>
<ul>
{% for hero in heros %}
<li>{{ hero.name }}---{{ hero.comment }}</li>
{% empty %}
<li>当heros这个列表为空时执行这条语句</li>
{% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
<!-- 这里返回的是对象,要想得到标题就 对象.标题 -->
{% for i in books %}
<li><a href="/books/{{ i.id }}">{{ i.title }}</a> </li>
{% endfor %}
</ul>
</body>
</html>
总结:当一个浏览器向Django网站服务器请求页面时,先会到项目的urls中进行匹配,然后再到应用的urls中进行匹配,匹配成功之后执行相应的视图函数,在视图函数中调用模板文件,最后返回内容显示给浏览器。