快速了解Django模板的使用

创建一个项目bcxt_tmpl
创建一个应用learn
配置url

i.在应用下创建一个urls.py模块

i.把我们应用创建的urls.py引入到项目里(做好关联)
url(r'^learn/', include(learn.urls))
视图

i.首先应该先创建HTML页面
默认配置下,Django 的模板系统会自动找到app下面的templates文件夹中的模板文件。

i.创建视图
def home(request):
return render(request, 'home.html')

i.配置url
from django.conf.urls import urlfrom learn import views

urlpatterns = [
url(r'^home/$', views.home)
]

i.跑起django项目
python manage.py runserver

i.在浏览器输入
http://127.0.0.1:8000/learn/home/
注意:render 是返回模板渲染
模板
显示一个基本的字符串在网页上
步骤1(思路:在视图里面定义):
from django.shortcuts import render

Create your views here.def home(request):

string = '欢迎来到北财学堂'
return render(request, 'home.html', {'string': string})

from django.shortcuts import render

Create your views here.def home(request):

string = '欢迎来到北财学堂'
context = {'string': string}
return render(request, 'home.html', context)

步骤2:在HTML里面渲染 {{ }}
在home.html里面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h1>{{ string }}</h1>
</body>
</html>
基本的 for 循环 和 List内容的显示
简单总结一下:一般的变量之类的用 {{ }}(变量),功能类的,比如循环,条件判断是用 {% %}(标签)

i.在视图函数里面定义一个列表给模板传过去
from django.shortcuts import render

Create your views here.def home(request):

alist = ['python全栈+人工智能', '大数据技术', 'HTML5', 'UI设计']
context = {'a': alist}
return render(request, 'home.html', context)


i.在模板里面操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
{% for xxxxx in a %}
<h1>{{ xxxxx }}</h1>



{% endfor %}

</body>
</html>
显示字典中内容
步骤1 在views.py里面配置内容
from django.shortcuts import render

Create your views here.def home(request):

adict = {'one': '蒙多', 'two': '猪妹'}
context = {'a': adict}
return render(request, 'home.html', context)

步骤2:在模板里面获取内容并展示
调用字典的值可以用 键名(context)+键名(adict的键)
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>home</title></head><body><h1>one:{{ a.one }}</h1><h2>two:{{ a.two }}</h2></body></html>
在模板进行 条件判断和 for 循环的详细操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
{% for item in List %}
{{ item }}{% if not forloop.last %},{% endif %}
{% endfor %}
</body>
</html>
from django.shortcuts import render

Create your views here.def home(request):

List = map(str, range(100))  # 一个长度为100的 List
return render(request, 'home.html', {'List': List})

网页跳转
urls.py
from django.conf.urls import urlfrom learn import views

urlpatterns = [
url(r'^home/$', views.home),
url(r'^detail/$', views.detail, name='deat')
]
views.py
def detail(request):
return render(request, 'detail.html')
最关键的一步,我们如何在网页中进行跳转,利用模板语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>

<a href="{% url 'deat' %}">跳转</a>
</body>
</html>
调用对象的方法
步骤:

  1. 新建一个项目test4、应用booktest
  2. 新建应用urls、然后配置项目urls
    from django.conf.urls import include, urlfrom django.contrib import adminfrom booktest import urls as booktest_urls

urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('booktest.urls', namespace='booktest'))
]

  1. 定义模型类
    from django.db import models

Create your models here.class BookInfo(models.Model):

btitle = models.CharField(max_length=20)
# db_column更改在数据库里面显示的字段名
bpub_date = models.DateTimeField(db_column='pub_date')
bread = models.IntegerField()
bcommet = models.IntegerField()
isDelete = models.BooleanField()

class Meta():
    db_table = 'bookinfo'

class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField()
hcontent = models.CharField(max_length=10000)
isDelete = models.BooleanField()
# 'BookInfo' 的引号问题,如果不加引号也行,前提是之前有定义BookInfo这个类,如果没定义也想外键 就必须加引号
book = models.ForeignKey('BookInfo')

  1. 编写一个index视图
    from django.shortcuts import renderfrom booktest.models import *

Create your views here.def index(request):

hero = HeroInfo.objects.get(pk=1)
context = {'hero': hero}
return render(request, 'index.html', context)
  1. 配置应用urls.py
    from django.conf.urls import urlfrom booktest import views

urlpatterns = [
url(r'^$', views.index,name='index')
]

  1. index.html配置
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    {{ hero.hname }}
    </body>
    </html>
    注意: 以上,我们在HTML里面是通过对象.属性进行调用
    7.另外一种方式调用对象
    1.在models.py中我们增加一个方法showname
    from django.db import models

Create your models here.class BookInfo(models.Model):

btitle = models.CharField(max_length=20)
# db_column更改在数据库里面显示的字段名
bpub_date = models.DateTimeField(db_column='pub_date')
bread = models.IntegerField()
bcommet = models.IntegerField()
isDelete = models.BooleanField()

class Meta():
    db_table = 'bookinfo'

class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField()
hcontent = models.CharField(max_length=10000)
isDelete = models.BooleanField()
# 'BookInfo' 的引号问题,如果不加引号也行,前提是之前有定义BookInfo这个类,如果没定义也想外键 就必须加引号
book = models.ForeignKey('BookInfo')

def showname(self):
    return self.hname

1.在html里面我们可以调用{{hero.showname}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ hero.showname }}
</body>
</html>
8.定义模板
1.在view.py中
from django.shortcuts import renderfrom booktest.models import *

Create your views here.def index(request):

# hero = HeroInfo.objects.get(pk=1)
# context = {'hero': hero}
list = HeroInfo.objects.all()
context = {'list': list}
return render(request, 'index.html', context)

1.在html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ hero.showname }}



{% for hero in list %}
<li>{{ forloop.counter }}:{{ hero.showname }}</li>
{% empty %}
啥也没有找到
{% endfor %}
</body>
</html>
其中:
{% for hero in list %}
如果有数据走这个分支
{% empty %}
如果没数据走这个分支
{% endfor %}
{{ forloop.counter }} # 表示循环的第几次
反向解析
步骤

  1. 创建一个show.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <h1>{{ id }}</h1>
    </body>
    </html>
  2. 定义一个视图show
    from django.shortcuts import renderfrom booktest.models import *

Create your views here.def index(request):

# hero = HeroInfo.objects.get(pk=1)
# context = {'hero': hero}
list = HeroInfo.objects.all()
context = {'list': list}
return render(request, 'index.html', context)

def show(request, id):
context = {'id': id}
return render(request, 'show.html', context)

  1. 配置url
    from django.conf.urls import urlfrom booktest import views

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'(\d+)', views.show, name='show')
]

  1. 在index.html中
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <a href="123">展示连接1</a>
    {{ hero.showname }}


    {% for hero in list %}
    <li>{{ forloop.counter }}:{{ hero.showname }}</li>
    {% empty %}
    啥也没有找到
    {% endfor %}
    </body>
    </html>
  2. 将项目跑起来,在index页面中点击链接
  3. 在index中
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <a href="{% url 'booktest:show' %}">展示连接1</a>
    {{ hero.showname }}


    {% for hero in list %}
    <li>{{ forloop.counter }}:{{ hero.showname }}</li>
    {% empty %}
    啥也没有找到
    {% endfor %}
    </body>
    </html>
  4. 可以带参数
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <a href="{% url 'booktest:show' 456 %}">展示连接1</a>
    {{ hero.showname }}


    {% for hero in list %}
    <li>{{ forloop.counter }}:{{ hero.showname }}</li>
    {% empty %}
    啥也没有找到
    {% endfor %}
    </body>
    </html>
    模板继承
    步骤一(模板继承)
  5. 创建一个base.html 和 index_2.html
  6. 在base.html中
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% block head %}{% endblock %}
    </head>
    <body>
    <h1>logo</h1>


    {% block content1 %}
    {% endblock %}


    <h1>contact</h1>

</body>
</html>

  1. 在index_2中,先删除所有HTML内容,剩下一个空白的HTML文档
    继承语法: {% extends 'base.html' %}
    {% extends 'base.html' %}
  2. 写一个临时用于练习的模板继承的视图
    def index2(request):
    return render(request, 'index_2.html')
  3. 配置urls
    from django.conf.urls import urlfrom booktest import views

urlpatterns = [
url(r'^$', views.index, name='index'),
# url(r'(\d+)', views.show, name='show'),
url(r'^index2/$', views.index2, name='index2'),
]

  1. 跑起django项目
    python manage.py runserver

7.在index_2.html中
{% extends 'base.html' %}

{% block content1%}
<h1>新填充的内容</h1>
{% endblock %}

三层继承结构

  1. 举个栗子(如图)

  2. 因为之前已经创建了base.html,我们现在只需要创建base_user.html和base_goods.html

  3. 因为base_user.html继承自base.html,所以在base_user中
    {% extends 'base.html' %}

  4. 同理,在base_goods.html中
    {% extends 'base.html' %}

  5. 在base_user.html中
    {% extends 'base.html' %}

{% block content1 %}
<table border="1">
<tr>
<td height="300">用户导航</td>
<td>{% block user_content %}{% endblock %}</td>
</tr>
</table>
{% endblock %}
6.添加新的user模板,譬如创建user1.html和user2.html,均继承自base_user.html
{% extends 'base_user.html' %}

  1. 在user1.html中
    {% extends 'base_user.html' %}
    {% block user_content %}
    <h2>用户中心1</h2>
    {% endblock user_content%}
  2. 在user2.html中
    {% extends 'base_user.html' %}
    {% block user_content %}
    <h2>用户中心2</h2>
    {% endblock user_content%}
    9.编写user1和user2的视图
    def index2(request):
    return render(request, 'index_2.html')

def user1(request):
return render(request, 'user1.html')

def user2(request):
return render(request, 'user2.html')

  1. 配置url
    from django.conf.urls import urlfrom booktest import views

urlpatterns = [
url(r'^$', views.index, name='index'),
# url(r'(\d+)', views.show, name='show'),
url(r'^index2/$', views.index2, name='index2'),
url(r'^user1/$', views.user1, name='user1'),
url(r'^user2/$', views.user2, name='user2')
]

HTML转义
步骤

  1. 创建一个htmlTest.html和配置视图
    def htmlTest(request):
    context = {'t1': '<h1>123</h1>'}
    return render(request, 'htmlTest.html', context)
  2. 在htmlTest.html中
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    {{ t1 }}
    </body>
    </html>
  3. 配置url
    from django.conf.urls import urlfrom booktest import views

urlpatterns = [
url(r'^$', views.index, name='index'),
# url(r'(\d+)', views.show, name='show'),
url(r'^index2/$', views.index2, name='index2'),
url(r'^user1/$', views.user1, name='user1'),
url(r'^user2/$', views.user2, name='user2'),
url(r'^htmlTest/$', views.htmlTest)
]

  1. 不行转义(默认是转义) safe
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    {{ t1|safe }}
    </body>
    </html>
  2. 关闭转义的另外一种方案
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    {{ t1|safe }}


    {% autoescape off%}
    {{ t1 }}
    {% endautoescape %}
    </body>
    </html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容