模板嵌套
创建通用模板
将blog_details.html,blog_list.html,blogs_with_type相同的部分提出来,封装到一个文件中去。
base.html
三个模板的title和内容不同,在base.html中挖出一个块提供给三个html文件使用。
<!DOCTYPE html>
<html lang="en">
<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>
使用通用模板
使用{% extends %}标签,{% extends %}标签有一个参数, 标记引用哪个模板文件, 这里的具体使用就是{% extends ‘base.html’ %}。
使用通用模板之后。
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 H:n:s" }}</p>
<p>分类:
<a href="{% url 'blogs_with_type' blog.blog_type.pk %}">
{{ blog.blog_type }}
</a>
</p>
<p>{{ blog.content }}</p>
{% endblock %}
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 %}
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里面, 后续这个应用迁移了, 其他应用就获取不到模板文件。
- 在settings配置文件里面把模板路径配置上, 需要基本文件 + 模板文件的路径
- 使用os.path.join进行路径拼接
setting.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'template'),
],
'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文件夹, 只存储blog这个应用的模板
现在views.py文件里面就访问不到模板文件了, 需要再添加一层目录
views.py
# 用模板显示响应的内容
from django.shortcuts import render_to_response, get_object_or_404
from .models import Blog, BlogType
# 博客列表
def blog_list(request):
content = {}
# 字典的key是对应的名称
content['blogs'] = Blog.objects.all()
content['count'] = Blog.objects.all().count()
# 传给前台数据并取得响应
return render_to_response('blog/blog_list.html', content)
# 博客详情
def blog_detail(request, blog_pk):
content = {}
# 根据主键查询博客
content['blog'] = get_object_or_404(Blog, pk=blog_pk)
return render_to_response('blog/blog_detail.html', content)
# 博客分类
def blog_with_type(request, blog_type_pk):
content = {}
blog_type = get_object_or_404(BlogType, pk=blog_type_pk)
content['blogs'] = Blog.objects.filter(blog_type=blog_type)
content['blog_type'] = blog_type
return render_to_response('blog/blog_with_type.html', content)