上一篇咱們優化了一些首頁和詳情頁代碼,可是咱們會發現不少html界面中有很是多的重複代碼。因此咱們就要用到django的模版標籤來優化。html
一、提取公共部分到base.htmldjango
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> {# 用來放標題 #} {% block title %} {% endblock %} </title> </head> <body> <div> <a href="{% url 'home' %}"> <h3>felix Blog</h3> </a> </div> <hr/> {# 用來放內容 #} {% block content %} {% endblock %} </body> </html>
二、改造以前的三個html文件app
{# 引用模板 #} {% 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 %}
{% extends 'base.html' %} {# 標題 #} {% block title %} felix Blog {% endblock %} {# 內容#} {% block content %} {% for blog in blogs %} <a href="{% url 'blog_detail' blog.pk %}"><h3>{{ blog.title }}</h3></a> {# 添加過濾器 文章太長時只顯示前30個字符 #} <p>{{ blog.content|truncatechars:30 }}</p> {% empty %} <p>--暫無博客,敬請期待--</p> {% endfor %} {# 過濾器統計博客數量 #} <p>一共有{{ blogs|length }}篇博客</p> {% endblock %}
{% 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> {# 添加過濾器 文章太長時只顯示前30個字符 #} <p>{{ blog.content|truncatechars:30 }}</p> {% empty %} <p>--暫無博客,敬請期待--</p> {% endfor %} {# 過濾器統計博客數量 #} <p>一共有{{ blogs|length }}篇博客</p> {% endblock %}
三、通過改造以後,發現重複代碼明顯變少了ide
開啓服務,和以前的訪問效果同樣函數
四、項目目錄測試
和上次相比,之變化了templates中的4個文件。優化
五、不得不提全局模版文件夾url
以前咱們的模版文件夾templates都是在app內的,這就會有個問題,當咱們app多了,若是這個app不用了,刪了,那app中的模板文件就不能使用了。因此咱們一般設置一個全局的模板文件夾,來存放各個app中須要的模板文件。spa
(1)、建立全局模版文件夾debug
在myblog項目下建立templates文件夾,再在templates文件夾下建立blog文件夾用來存放blog app的模版文件。
而後把以前在app中的模版文件移到新建立的模版文件夾中。
由於新建立的模版文件夾,django沒法找到,因此咱們要修改settings.py文件,讓django能找到模板文件夾templates。
修改settings文件中的TEMPLATES字段
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', ], }, }, ]
而後修改視圖文件views.py,讓html路徑能讓視圖函數找到
from django.shortcuts import render_to_response, get_object_or_404 from .models import Blog, BlogType # Create your views here. # 博客列表 def blog_list(requests): context = { 'blogs': Blog.objects.all() } return render_to_response('blog/blog_list.html', context) # 博客詳情 def blog_detail(requests, blog_pk): context = { 'blog': get_object_or_404(Blog, pk=blog_pk) } return render_to_response('blog/blog_detail.html', context) def blogs_with_type(requests, blog_type_pk): blog_type = get_object_or_404(BlogType, pk=blog_type_pk) context = { 'blogs': Blog.objects.filter(blog_type=blog_type), 'blog_type':blog_type, } return render_to_response('blog/blog_with_type.html', context)
(2)、最後修改好的項目目錄以下:
把原來在blog app下的模版文件移動到了全局的模板文件下了,而且修改了views.py中的視圖函數和settings.py中的Templates路徑。
六、最後啓動服務測試
測試效果和上一篇博客相同。只是代碼邏輯更加優化了,代碼更加簡便。
七、最後模版文件的設置建議
app模版文件--》放在app中
project模版文件--》放在全局模板中