视频链接;【Django2.0教程】09.模版嵌套
常用的模板标签
现在工程中有三个html文件(blog_list.html、blog_detail.html和blogs_with_type.html),它们之中有很多重复的内容,即:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div>
<a href="{% url 'home' %}">
<h3>个人博客网站</h3>
</a>
</div>
<hr>
</body>
</html>
将其取出,放置于另一个文件(base.html)中,并使用模板嵌套标签block:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<div>
<a href="{% url 'home' %}">
<h3>个人博客网站</h3>
</a>
</div>
<hr>
{% block content %}{% endblock %}
</body>
</html>
其中,“title”和“content”为标签的名字,以在使用的时候可以区分。
使用模板嵌套标签extend来扩展base.html中的内容。修改blog_list.html:
{% extends 'base.html' %}
{% block title %}
我的网站
{% endblock %}
{% block content %}
{% for blog in blogs %}
<a href="{% url 'blog_detail' blog.pk %}">
<h3>{{ blog.title }}</h3>
</a>
<p>{{ blog.content|truncatechars:30 }}</p>
{% empty %}
<p>---暂无博文,敬请期待---</p>
{% endfor %}
<p>一共有{{ blogs|length }} 篇博文</p>
{% endblock %}
blog_detail.html
{% extends 'base.html' %}
{% block title %}
{{ blog.title }}
{% endblock %}
{% block content %}
<h3>{{ blog.title }}</h3>
<p>作者:{{ blog.author }}</p>
<p>发表日期:{{ blog.created_time|date:"Y-m-d" }}</p>
<p>分类:
<a href='{% url 'blogs_with_type' blog.blog_type.pk %}'>
{{ blog.blog_type }}
</a>
</p>
<p>{{ blog.content }}</p>
{% endblock %}
blogs_with_type.html
{% extends 'base.html'%}
{% block title %}
{{ blog_type.type_name }}
{% endblock%}
{% block content %}
<h3>{{ blog_type.type_name }}</h3>
{% for blog in blogs %}
<a href="{% url 'blog_detail' blog.pk %}">
<h3>{{ blog.title }}</h3>
</a>
<p>{{ blog.content|truncatechars:30 }}</p>
{# 这是注释 #}
{% empty %}
<p>---暂无博文,敬请期待---</p>
{% endfor %}
<p>一共有{{ blogs|length }} 篇博文</p>
{% endblock %}
全局模板文件夹
如果工程中不止一个APP,而希望有一个共用的base.html,那么将其放在全局模板文件夹中是更好的选择。
新建目录templates,因为程序不能找到这个templates目录,所以修改mysite/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',
],
},
},
]
...
移动blog/templates/base.html至templates/。
模板文件设置建议
如果APP封装得特别好,那么html文件就放在APP路径中,否则建议放在templates/中。同时,新建templates/blog/目录,将blog_list.html、blog_detail.html和blogs_with_type.html放于其中,并修改blog/views.py:
...
return render_to_response('blog/blog_list.html', context)
...
return render_to_response('blog/blog_detail.html', context)
...
return render_to_response('blog/blogs_with_type.html', context)
...