模板嵌套
创建通用模板
- 把相同的部分提出, 封装到一个文件里
base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div>
<a href="{% url 'home' %}">
<h2>个人博客网站</h2>
</a>
</div>
</body>
</html>
- 三个模板的title不同, 把title标签腾出一个位置供三个模板使用
<title>{% block %}{% endblock %}</title>
- 一个模板里面可能存在多个块, 给块添加一个名称防止弄混
<title>{% block title %}{% endblock %}</title>
- 三个模板的body不同, 在body里面腾出一个位置供三个模板使用
{% block content %}{% endblock %}
使用通用模板
- 使用{% extends %}标签
- {% extends %}标签有一个参数, 标记引用哪个模板文件, 这里的具体使用就是{% extends ‘base.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 'blog_with_type' blog.blog_type.pk %}">
{{ blog.blog_type }}
</a>
</p>
<p>{{ blog.content }}</p>
{% endblock %}
全局模板文件夹的设置
如果有多个应用同时使用同一个模板文件, 那么把模板文件单独封装到一个文件夹会让模板的使用更清晰明了.
另一个问题就是, 如果把模板文件放到一个app里面, 后续这个应用迁移了, 其他应用就获取不到模板文件
- 在settings配置文件里面把模板路径配置上, 需要基本文件 + 模板文件的路径
- 使用os.path.join进行路径拼接
settings.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)