欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django之Django快速体验

程序员文章站 2022-10-08 20:50:35
Django之Django快速体验,内容包括Django快速体验,ORM简介,模型,Django后台管理,视图,模板,MVT综合案例;其中,模型包括 模型类设计,模型类生成表,通过模型类操作数据表; ......

django快速体验

 

前语:

这一节内容是直接快速上手,后面的内容是对内容进行按步解释,如果不想看解析的,可以直接只看这一节的内容。

1.新建项目应用
新建项目test1
新建应用booktest

2.注册应用
去test1下面的settings.py文件下注册应用

installed_apps = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest',
)

3.编写数据库相关代码
编写模型类代码

models.py

from django.db import models

# 设计和表对应的类-模型类
# create your models here.


# 一类
# 图书类
class bookinfo(models.model):
    """图书模型类"""
    # 图书名称,charfield说明是一个字符串,max_length制定字符串的最大长度
    btitle = models.charfield(max_length=20)
    # 出版日期,datefield说明是一个日期类型
    bpub_date = models.datefield()

    def __str__(self):
        # 返回书名
        return self.btitle


# 多类
# 英雄类
# 关系属性,hbook,建立图书类和英雄人物类之间的一对多关系
class heroinfo(models.model):
    """英雄人物模型类"""
    hname = models.charfield(max_length=20)  # 英雄名称
    # 性别,指定为bool类型,false代表性别为男
    hgender = models.booleanfield(default=false)
    # 备注/大招技能
    hcomment = models.charfield(max_length=120)
    hbook = models.foreignkey("bookinfo")

    def __str__(self):
        # 返回英雄名
        return self.hname

4.数据迁移
进行数据迁移,命令行下:
生成迁移文件

python manage.py makemigrations

执行迁移生成表

python mange.py migrate

5.本地化
去settings.py下修改语言和时区

# language_code = 'en-us'
language_code = 'zh-hans'

# time_zone = 'utc'
time_zone = 'asia/shanghai'

6.注册超级用户
命令行下:

python manage.py createsuperuser

7.在应用下的admin.py中注册模型类。
在应用下的admin.py文件对后台管理进行配置
admin.py

from django.contrib import admin
from booktest.models import bookinfo,heroinfo

# 后台管理相关文件
# register your models here.


# 自定义模型管理类,控制在admin后台显示的字段信息
class bookinfoadmin(admin.modeladmin):
    """图书模型管理类"""
    list_display = ['id', 'btitle', 'bpub_date']


class heroinfoadmin(admin.modeladmin):
    """英雄模型管理类"""
    list_display = ['id', 'hname', 'hcomment']


# 注册模型类
admin.site.register(bookinfo, bookinfoadmin)
admin.site.register(heroinfo, heroinfoadmin)

8.运行程序

linux在命令行下,进入虚拟环境,进入项目所在目录;python manage.py runserver
pycharm下点击右上角的朝右绿色箭头,注意选中test1;或者点击菜单栏的run,run "test1";再或者如果你的pycharm版本较高的话,
可以点击左下角的一个terminal,会进入命令行模式,

python manage.py runserver

9.后台管理

在浏览器上输入:http://127.0.0.1:8000/admin
输入超级用户账号和密码
即可进行数据库操作,增删改查

10.视图代码编写
views.py

from django.shortcuts import render
from django.http import httpresponse
from django.template import loader, requestcontext
# create your views here.

def my_render(request, template_path, context_dict={}):
    """使用模板文件"""
    # 使用模板文件
    # 1.加载模板文件
    temp= loader.get_template(template_path)
    # 2.定义模板上下文:给模板传数据
    context = requestcontext(request, context_dict)
    # 3.模板渲染:产生标准的html内容
    res_html = temp.render(context)
    # 4.返回给浏览器
    return httpresponse(res_html)


# 1.定义视图函数,httprequest
# 2.进行url配置,目的是建立url地址和视图的对应关系
# http://127.0.0.1:8000/index
def index(request):
    # 进行处理,和m与t进行交互
    # return httpresponse("okay")

    # # 使用模板文件
    # # 1.加载模板文件
    # temp= loader.get_template('booktest/index.html')
    # # 2.定义模板上下文:给模板传数据
    # context = requestcontext(request, {})
    # # 3.模板渲染:产生标准的html内容
    # res_html = temp.render(context)
    # # 4.返回给浏览器
    # return httpresponse(res_html)
    # my_render(request, "booktest/index.html")
    return render(request, "booktest/index.html",
                  {'content': 'hello world',
                   'list': list(range(1, 10))})


def index2(request):
    # 进行处理,和m与t进行交互
    return httpresponse("hello index2")

11.静态文件夹和静态文件
新建templates文件夹
templates下新建booktest文件夹
booktest下新建index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>index</title>
</head>
<body>
    <h2>index页面</h2>

    使用模板文件:<br/>
    <h3>{{ content }}</h3> <br/>

    使用列表:<br/>
    <p>{{ list }}</p> <br/>

    for循环:<br/>
    <ul>
        {% for i in list %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
</body>
</html>

12.设置templates模板文件目录
去settings.py下设置模板文件目录

templates = [
    {
        'backend': 'django.template.backends.django.djangotemplates',
        'dirs': [os.path.join(base_dir, "templates")],  # 设置模板文件目录
        'app_dirs': true,
        'options': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

13.应用路由分发
在应用下新建urls.py文件,写入

booktest/urls.py
from django.conf.urls import url
from booktest import views

# 在应用的urls文件中进行url匹配的时候,应严控控制匹配的开头和结尾
urlpatterns = [
    # 通过url函数设置路由配置项
    url('^index$', views.index),  # 建立index路由和视图index之间的关系
    url('^index2$', views.index2),  # 建立index路由和视图index之间的关系
]

14.项目路由分发
test1/urls.py

from django.conf.urls import include, url
from django.contrib import admin
from booktest import urls

# 项目的urls文件
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),  # 配置项目
    url(r'^', include('booktest.urls')),  # 配置项目,包含booktest应用中的urls文件
]

15.快速体验web

在浏览器上输入:http://127.0.0.1:8000/index
即可看到一个有数据的界面

 

orm简介

orm

Django之Django快速体验

  1. django中内嵌了orm框架,orm框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。
  2. 设计类:模型类。
  3. orm另外一个作用:根据设计的类生成数据库中的表。
  4. 在model.py中设计和表对应的类-模型类;

 

模型

模型类设计

模型类设计和表生成

  • 在应用models.py中设计模型类。
  • 必须继承于models.model类。

1)设计bookinfo类。
2)设计heroinfo类。
models.foreignkey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多的表中创建一列作为外键,建立两个表之间一对多的关系。

from django.db import models
# 设计和表对应的类,模型类
# create your models here.

# 一类
# 图书类
class bookinfo(models.model):
    '''图书模型类'''
    # 图书名称,charfield说明是一个字符串,max_length指定字符串的最大长度
    btitle = models.charfield(max_length=20)
    # 出版日期,datefield说明是一个日期类型
    bpub_date = models.datefield()

    def __str__(self):
        # 返回书名
        return self.btitle

# 多类
# 英雄人物类
# 英雄名 hname
# 性别 hgender
# 年龄 hage
# 备注 hcomment
# 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
class heroinfo(models.model):
    '''英雄人物模型类'''
    hname = models.charfield(max_length=20) # 英雄名称
    # 性别,booleanfield说明是bool类型,default指定默认值,false代表男
    hgender = models.booleanfield(default=false)
    # 备注
    hcomment = models.charfield(max_length=128)
    # 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
    # 关系属性对应的表的字段名格式: 关系属性名_id
    hbook = models.foreignkey('bookinfo')

    def __str__(self):
        # 返回英雄名
        return self.hname

 

模型类生成表

1)生成迁移文件
命令:

python manage.py makemigrations

迁移文件是根据模型类生成的。

2)执行迁移生成表
命令:

python mange.py migrate

根据迁移文件生成表。
生成表名的默认格式:应用名_模型类名小写

模型类表生成示例

// 在model.py文件编写好模型类代码,进入虚拟环境
(cp15) python@ubuntu:~/day01/test1$ python manage.py makemigrations    //生成迁移文件
(cp15) python@ubuntu:~/day01/test1$ python mange.py migrate    //执行迁移文件表
(cp15) python@ubuntu:~/day01/test1$ sudo apt-get install sqliteman    //安装可视数据库软件sqliteman
(cp15) python@ubuntu:~/day01/test1$ sqliteman    //打开可视数据库软件

django默认使用的数据库是sqlite,单这只是小型数据库,不满足web开发需求,仅适用于手机端的软件,所以我们一般不用这个,这里了解认识一下;

 

通过模型类操作数据表

进入项目shell的命令:

python manage.py shell

以下为在相互shell终端中演示的例子:
首先导入模型类:

from booktest.models import bookinfo,heroinfo

1)向booktest_bookinfo表中插入一条数据。

b = bookinfo()  # 定义一个bookinfo类的对象
b.btitle ='天龙八部'  # 定义b对象的属性并赋值
b.bpub_date = date(1990,10,11) 
b.save()  # 才会将数据保存进数据库

2)查询出booktest_bookinfo表中id为1的数据。

b = bookinfo.objects.get(id=1) 

3)在上一步的基础上改变b对应图书的出版日期。

b.bpub_date = date(1989,10,21)
b.save() #才会更新表格中的数据

4)紧接上一步,删除b对应的图书的数据。

b.delete() #才会删除

5)向booktest_heroinfo表中插入一条数据。

h = heroinfo()
h.hname = '郭靖'
h.hgender = false
h.hcomment = ‘降龙十八掌’
b2 = bookinfo.objects.get(id=2)
h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象
h.save() 

6)查询图书表里面的所有内容。

bookinfo.objects.all()
heroinfo.objects.all()

 

关系操作

Django之Django快速体验

1)查询出id为2的图书中所有英雄人物的信息。

b = bookinfo.objects.get(id=2)
b.heroinfo_set.all() #查询出b图书中所有英雄人物的信息

 

模型-模型类关系和关系查询示例

(cp15) python@ubuntu:~/day01/test1$ python manage.py shell
python@ubuntu:~$ workon cp15
(cp15) python@ubuntu:~$ ls
day01 desktop downloads examples.desktop pictures templates workspace
dbs documents dump.rdb music public videos
(cp15) python@ubuntu:~$ cd day01
(cp15) python@ubuntu:~/day01$ ls
test1
(cp15) python@ubuntu:~/day01$ cd test1

(cp15) python@ubuntu:~/day01/test1$ python manage.py shell
python 3.5.2 (default, nov 12 2018, 13:43:14) 
[gcc 5.4.0 20160609] on linux
type "help", "copyright", "credits" or "license" for more information.
(interactiveconsole)
>>> from booktest.models import bookinfo,heroinfo

>>> b = bookinfo()
>>> b.title = '天龙八部'
>>> from datetime import date
>>> b.bpub_date = date(1990,1,1)
>>> b.save()
>>> b.btitle = '天龙八部'
>>> b.save()

>>> h = heroinfo()
>>> h.hname = '段誉'
>>> h.hgender = false
>>> h.hcomment = '六脉神剑'
>>> h.hbook = b
>>> h.save()

>>> h2 = heroinfo()
>>> h2.hname = '乔峰'
>>> h2.hgender = false
>>> h2.hcomment = '降龙十八掌'
>>> h2.hbook = b
>>> h2.save()

>>> h3 = heroinfo.objects.get(id=2)
>>> h3.hname
'乔峰'
>>> h3.hbook_id
1
>>> h3.hbook
<bookinfo: bookinfo object>
>>> h3.hbook.btitle
'天龙八部'

# 查询书籍表中所有包含的英雄列表
>>> b.heroinfo_set.all()
[<heroinfo: heroinfo object>, <heroinfo: heroinfo object>]
# 查询书籍表里面有多少数据
>>> bookinfo.objects.all()
[<bookinfo: bookinfo object>]
>>> quit()

 

 

django后台管理

后台管理
1)本地化
语言和时区的本地化。
修改settings.py文件,修改后台django语言和时区,zh-hans,asia/shanghai

# language_code = 'en-us'
language_code = 'zh-hans'

# time_zone = 'utc'
time_zone = 'asia/shanghai'

 

2)创建管理员
命令:

python manage.py createsuperuser

创建超级用户及运行演示示例

(cp15) python@ubuntu:~/day01/test1$ python manage.py createsuperuser
username (leave blank to use 'python'): admin
email address: 
password: 
password (again): 
superuser created successfully.
(cp15) python@ubuntu:~/day01/test1$ python manage.py runserver
performing system checks...
// 浏览器打开 http://127.0.0.1:8000/admin/
// 账号admin 密码root

 

3)注册模型类
在应用下的admin.py中注册模型类。
告诉djang框架根据注册的模型类来生成对应表管理页面。

// admin.py

from django.contrib import admin
from booktest.models import bookinfo,heroinfo

# 后台管理相关文件
# register your models here.


# 注册模型类
admin.site.register(bookinfo)
admin.site.register(heroinfo)

// models.py

from django.db import models

# 设计和表对应的类-模型类
# create your models here.

# 一类
# 图书类
class bookinfo(models.model):
    """图书模型类"""
    # 图书名称,charfield说明是一个字符串,max_length制定字符串的最大长度
    btitle = models.charfield(max_length=20)
    # 出版日期,datefield说明是一个日期类型
    bpub_date = models.datefield()
    
    def __str__(self):
        # 返回书名
        return self.btitle

# 多类
# 英雄类
# 关系属性,hbook,建立图书类和英雄人物类之间的一对多关系
class heroinfo(models.model):
    """英雄人物模型类"""
    hname = models.charfield(max_length=20)  # 英雄名称
    # 性别,指定为bool类型,false代表性别为男
    hgender = models.booleanfield(default=false)
    # 备注/大招技能
    hcomment = models.charfield(max_length=120)
    hbook = models.foreignkey("bookinfo")

    def __str__(self):
        # 返回英雄名
        return self.hname

 

如果没有使用__str__方法的话,就会在admin页面上显示xxx.object,因为:

b = bookinfo.objects.get(btitle='天龙八部')
c = str(b)

而页面上的xxx.object就是str(b),如果我们要让admin页面上显示其他,就重写__str__方法。

可以使用admin后台管理添加修改删除数据,因为是可视化界面,请自行尝试;


4)自定义管理页面(部分)
自定义模型管理类。模型管理类就是告诉django在生成的管理页面上显示哪些内容。

from django.contrib import admin
from booktest.models import bookinfo,heroinfo

# 后台管理相关文件
# register your models here.


# 自定义模型管理类,控制在admin后台显示的字段信息
class bookinfoadmin(admin.modeladmin):
    """图书模型管理类"""
    list_display = ['id', 'btitle', 'bpub_date']


class heroinfoadmin(admin.modeladmin):
    """英雄模型管理类"""
    list_display = ['id', 'hname', 'hcomment']


# 注册模型类
admin.site.register(bookinfo, bookinfoadmin)
admin.site.register(heroinfo, heroinfoadmin)

 

视图

在django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容。

视图函数的使用
1)定义视图函数
视图函数定义在views.py中。
例:

def index(request):
    #进行处理。。。
    return httpresponse('hello python')

视图函数必须有一个参数request,进行处理之后,需要返回一个httpresponse的类对象,hello python就是返回给浏览器显示的内容。


2)进行url配置

Django之Django快速体验

 


url配置的目的是让建立url和视图函数的对应关系。url配置项定义在urlpatterns的列表中,每一个配置项都调用url函数。
url函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作。

配置url时,有两种语法格式:

  • a) url(正则表达式,视图函数名)
  • b) url(正则表达式,include(应用中的urls文件))

工作中在配置url时,首先在项目的urls.py文件中添加配置项时,并不写具体的url和视图函数之间的对应关系,而是包含具体应用的urls.py文件,在应用的urls.py文件中写url和视图函数的对应关系。


url匹配的过程
在项目的urls.py文件中包含具体应用的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系。

Django之Django快速体验

 

当用户输入如http://127.0.0.1:8000/aindex时,去除域名和最前面的/,剩下aindex,

拿aindex字符串到项目的urls文件中进行匹配,配置成功之后,去除匹配的a字符,

那剩下的index字符串继续到项目的urls文件中进行正则匹配,匹配成功之后执行视图函数index,

index视图函数返回内容hello python给浏览器来显示。


注意一下http://127.0.0.1:8000/index和http://127.0.0.1:8000/index/,后面的可能会出错。

views.py

from django.shortcuts import render
from django.http import httpresponse

# create your views here.


# 1.定义视图函数,httprequest
# 2.进行url配置,目的是建立url地址和视图的对应关系
# http://127.0.0.1:8000/index
def index(request):
    # 进行处理,和m与t进行交互
    return httpresponse("okay")


def index2(request):
    # 进行处理,和m与t进行交互
    return httpresponse("hello index2")

在应用booktest下新建urls.py,
booktest/urls.py

from django.conf.urls import url
from booktest import views

# 在应用的urls文件中进行url匹配的时候,应严控控制匹配的开头和结尾
urlpatterns = [
    # 通过url函数设置路由配置项
    url('^index$', views.index),  # 建立index路由和视图index之间的关系
    url('^index2$', views.index2),  # 建立index路由和视图index之间的关系
]

test1/urls.py

from django.conf.urls import include, url
from django.contrib import admin
from booktest import urls

# 项目的urls文件
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),  # 配置项目
    url(r'^', include('booktest.urls')),  # 配置项目,包含booktest应用中的urls文件
]

 

知道路由匹配的流程。

 

模板

模板不仅仅是一个html文件。

模板文件的使用
1)创建模板文件夹
2)配置模板目录
3) 使用模板文件
  a)加载模板文件
    去模板目录下面获取html文件的内容,得到一个模板对象。
  b)定义模板上下文
    向模板文件传递数据。
  c)模板渲染
    得到一个标准的html内容。

给模板文件传递数据

模板变量使用:{{ 模板变量名 }}
模板代码段:{%代码段%}
for循环:
{% for i in list %}
{% endfor %}

 

在项目目录下新建templates文件夹,和应用同级;

templates = [
    {
        'dirs': [os.path.join(base_dir, "templates")],  # 设置模板文件目录
    },
]

 

如果有多个应用,为了不混淆html文件,会在templates下再对每个应用新建一个对应名文件;

templates/test1/index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>index</title>
</head>
<body>
    <h2>index页面</h2>

    使用模板文件:<br/>
    <h3>{{ content }}</h3> <br/>

    使用列表:<br/>
    <p>{{ list }}</p> <br/>

    for循环:<br/>
    <ul>
        {% for i in list %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
</body>
</html>

views.py

from django.shortcuts import render
from django.http import httpresponse
from django.template import loader, requestcontext
# create your views here.

def my_render(request, template_path, context_dict={}):
    """使用模板文件"""
    # 使用模板文件
    # 1.加载模板文件
    temp= loader.get_template(template_path)
    # 2.定义模板上下文:给模板传数据
    context = requestcontext(request, context_dict)
    # 3.模板渲染:产生标准的html内容
    res_html = temp.render(context)
    # 4.返回给浏览器
    return httpresponse(res_html)


# 1.定义视图函数,httprequest
# 2.进行url配置,目的是建立url地址和视图的对应关系
# http://127.0.0.1:8000/index
def index(request):
    # 进行处理,和m与t进行交互
    # return httpresponse("okay")

    # # 使用模板文件
    # # 1.加载模板文件
    # temp= loader.get_template('booktest/index.html')
    # # 2.定义模板上下文:给模板传数据
    # context = requestcontext(request, {})
    # # 3.模板渲染:产生标准的html内容
    # res_html = temp.render(context)
    # # 4.返回给浏览器
    # return httpresponse(res_html)
    # my_render(request, "booktest/index.html")
    return render(request, "booktest/index.html",
                  {'content': 'hello world',
                   'list': list(range(1, 10))})

其中,render函数相当于执行了上面的my_render函数,实际开发中只要写render即可,这里是为了理解render的作用而演示;

 

mvt综合案例

案例完成
编码之前的准备工作:
1)设计出访问页面的url和对应的视图函数的名字,确定视图函数的功能。
2)设计模板文件的名字。


以下为案例中的简单设计过程:
1)完成图书信息的展示:
  a)设计url,通过浏览器访问 http://127.0.0.1:8000/books/ 时显示图书信息页面。
  b)设计url对应的视图函数show_books。
    查询出所有图书的信息,将这些信息传递给模板文件。
  c)编写模板文件show_books.html。
    遍历显示出每一本图书的信息。

2)完成点击某本图书时,显示出图书里所有英雄信息的页面。
  a)设计url,通过访问http://127.0.0.1:8000/数字/时显示对应的英雄信息页面。
    这里数字指点击的图书的id。
  b)设计对应的视图函数detail。
    接收图书的id,根据id查询出相应的图书信息,然后查询出图书中的所有英雄信息。
  c)编写模板文件detail.html。


指定项目运行ip及端口:python manage.py runserver 127.0.0.1:8888

 

综合案例代码

booktest/admin.py

from django.contrib import admin
from booktest.models import bookinfo,heroinfo
# 后台管理相关文件
# register your models here.
# 自定义模型管理类
class bookinfoadmin(admin.modeladmin):
    '''图书模型管理类'''
    list_display = ['id', 'btitle', 'bpub_date']


class heroinfoadmin(admin.modeladmin):
    '''英雄人物模型管理类'''
    list_display = ['id', 'hname', 'hcomment']

# 注册模型类
# admin.site.register(bookinfo)
admin.site.register(bookinfo, bookinfoadmin)
admin.site.register(heroinfo, heroinfoadmin)

booktest/models.py

from django.db import models
# 设计和表对应的类,模型类
# create your models here.

# 一类
# 图书类
class bookinfo(models.model):
    '''图书模型类'''
    # 图书名称,charfield说明是一个字符串,max_length指定字符串的最大长度
    btitle = models.charfield(max_length=20)
    # 出版日期,datefield说明是一个日期类型
    bpub_date = models.datefield()

    def __str__(self):
        # 返回书名
        return self.btitle

# 多类
# 英雄人物类
# 英雄名 hname
# 性别 hgender
# 年龄 hage
# 备注 hcomment
# 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
class heroinfo(models.model):
    '''英雄人物模型类'''
    hname = models.charfield(max_length=20) # 英雄名称
    # 性别,booleanfield说明是bool类型,default指定默认值,false代表男
    hgender = models.booleanfield(default=false)
    # 备注
    hcomment = models.charfield(max_length=128)
    # 关系属性 hbook,建立图书类和英雄人物类之间的一对多关系
    # 关系属性对应的表的字段名格式: 关系属性名_id
    hbook = models.foreignkey('bookinfo')

    def __str__(self):
        # 返回英雄名
        return self.hname

booktest/views.py

from django.shortcuts import render
from django.http import httpresponse
from booktest.models import bookinfo # 导入图书模型类
from django.template import loader,requestcontext

def my_render(request, template_path, context_dict={}):
    '''使用模板文件'''
    # 使用模板文件
    # 1.加载模板文件, 模板对象
    temp = loader.get_template(template_path)
    # 2.定义模板上下文:给模板文件传递数据
    context = requestcontext(request, context_dict)
    # 3.模板渲染:产生标准的html内容
    res_html = temp.render(context)
    # 4.返回给浏览器
    return httpresponse(res_html)


# create your views here.
# 1.定义视图函数,httprequest
# 2.进行url配置,建立url地址和视图的对应关系
# http://127.0.0.1:8000/index
def index(request):
    # 进行处理,和m和t进行交互。。。
    # return httpresponse('老铁,没毛病')
    # return my_render(request, 'booktest/index.html')
    return render(request, 'booktest/index.html', {'content':'hello world', 'list':list(range(1,10))})


# http://127.0.0.1:8000/index2
def index2(request):
    return httpresponse('hello python')


def show_books(request):
    '''显示图书的信息'''
    # 1.通过m查找图书表中的数据
    books = bookinfo.objects.all()
    # 2.使用模板
    return render(request, 'booktest/show_books.html', {'books':books})


def detail(request, bid):
    '''查询图书关联英雄信息'''
    # 1.根据bid查询图书信息
    book = bookinfo.objects.get(id=bid)
    # 2.查询和book关联的英雄信息
    heros = book.heroinfo_set.all()
    # 3.使用模板
    return render(request, 'booktest/detail.html', {'book':book, 'heros':heros})

booktest/urls.py

from django.conf.urls import url
from booktest import views
# index
# index2
# index2/
# 在应用的urls文件中进行url配置的时候:
# 1.严格匹配开头和结尾
urlpatterns = [
    # 通过url函数设置url路由配置项
    url(r'^index$', views.index), # 建立/index和视图index之间的关系
    url(r'^index2$', views.index2),
    url(r'^books$', views.show_books), # 显示图书信息
    url(r'^books/(\d+)$', views.detail), # 显示英雄信息
]

test1/urls.py

from django.conf.urls import include, url
from django.contrib import admin

# 项目的urls文件
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)), # 配置项目
    url(r'^', include('booktest.urls')), # 包含booktest应用中的urls文件
]

templates/detail.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>显示图书关联的英雄信息</title>
</head>
<body>
<h1>{{ book.btitle }}</h1>
英雄信息如下:<br/>
<ul>
    {% for hero in heros %}
        <li>{{ hero.hname }}--{{ hero.hcomment }}</li>
    {% empty %}
        <li>没有英雄信息</li>
    {% endfor %}
</ul>
</body>
</html>

templates/index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>模板文件</title>
</head>
<body>
<h1>这是一个模板文件</h1>
使用模板变量:<br/>
{{ content }}<br/>
使用列表:<br/>
{{ list }}<br/>
for循环:<br/>
<ul>
    {% for i in list %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
</body>
</html>

templates/show_books.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>显示图书信息</title>
</head>
<body>
图书信息如下:
<ul>
    {% for book in books %}
        <li><a href="/books/{{ book.id }}">{{ book.btitle }}</a></li>
    {% endfor %}
</ul>
</body>
</html>