搭建本身的博客(五):使用模版標籤優化前端代碼

上一篇咱們優化了一些首頁和詳情頁代碼,可是咱們會發現不少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>
base.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 %}
blog_detail.html
{% 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 %}
blog_list.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>
        {#    添加過濾器 文章太長時只顯示前30個字符  #}
        <p>{{ blog.content|truncatechars:30 }}</p>
    {% empty %}
        <p>--暫無博客,敬請期待--</p>
    {% endfor %}
    {# 過濾器統計博客數量 #}
    <p>一共有{{ blogs|length }}篇博客</p>
{% endblock %}
blog_with_type.html

三、通過改造以後,發現重複代碼明顯變少了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)
views.py

(2)、最後修改好的項目目錄以下:

把原來在blog app下的模版文件移動到了全局的模板文件下了,而且修改了views.py中的視圖函數和settings.py中的Templates路徑。

 六、最後啓動服務測試

測試效果和上一篇博客相同。只是代碼邏輯更加優化了,代碼更加簡便。

七、最後模版文件的設置建議

app模版文件--》放在app中

project模版文件--》放在全局模板中

相關文章
相關標籤/搜索