Django核心基础(4): 模板(Template)的设计及常用过滤器与标签介绍

Django核心基础(4): 模板(Template)的设计及常用过滤器与标签介绍
2018年05月22日 11:41:43 大江狗 阅读数:255更多
所属专栏: Django基础连载
版权声明:本文系大江狗原创,请勿直接copy应用于你的出版物或任何公众平台。 https://blog.youkuaiyun.com/weixin_42134789/article/details/80403575
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。今天小编我就来拼个老命给你来介绍下第四项Django核心基础知识之模板Template的设计吧, 并重点介绍下Django模板过滤器与标签。想持续了解后续Django Web开发技术请订阅我的公众号【Python与Django大咖之路】。

什么是模板(Template)? Django的Template是如何工作的

Django的模板是静态的html文件,它只决定了一个页面的样式或外观。它需要视图View传递过来的变量(Variable)或内容对象(Context object)才能被渲染成一个完整的页面。这样做的好处是实现了样式与业务逻辑的分离,便于前端和后端Web开发人员各自完成自己的开发工作。

我们先来看一个新闻博客的例子。当用户访问/blog/article/2/的时候,URL路由器会调用视图views.py的article_detail方法。article_detail所做的就是提取id=2的文章对象,通过render方法,将它传递到模板文件/blog/article_detail.html。

blog/urls.py

from django.urls import path

from . import views

urlpatterns = [
path(‘blog/article/int:id/’, views.article_detail, name=‘article_detail’),
]

blog/views.py

from django.shortcuts import render, get_object_or_404
from .models import Article

def article_detail(request, id):
article = get_object_or_404(Article, pk=id)
return render(request, ‘blog/article_detail.html’, {“article”: article})

下图是模板文件blog/article_detail.html的代码。在模板文件里我们可以通过双括号{{ article }} 显示变量或内容对象,还可以通过点号(.)用来直接访问变量的属性。

{% block content %}
{{ article.title }}
{{ article.pub_date }}
{{ article.body }}
{% endblock %}

模板(Template)文件的正确位置

对于html模板文件,我们建议放在app/templates/app/文件夹里,而不是简单放在app/templates/里。看似我们多加了一层文件夹使问题复杂化了,但这样做实际上更安全。这与Django查找模板文件的方法有关。因为我们多加了一层app,这样Django只会查找app文件夹里的模板文件。在views.py里我们也建议通过app/template_name.html调用template,这样会杜绝与其它同名template的冲突。更多内容见【Django项目文件与文件夹的合理布局】

模板过滤器Filter

您可以通过使用过滤器来改变变量在模板中的显示。比如{{ article.title | lower }} 中lower过滤器可以让文章的标题转化为小写。Django的模板提供了许多内置过滤器,你可以直接使用,非常方便。

下面是一些Django模板常用过滤器。

过滤器 例子
lower, upper {{ article.title | lower }} 大小写
length {{ name | length }} 长度
default {{ value | default: “0” }} 默认值
date {{ picture.date | date:“Y-m-j” }} 日期格式
dicsort {{ value | dicsort: “name” }} 字典排序
escape {{ title | escape }} 转义
filesizeformat {{ file | filesizeformat }} 文件大小
first, last {{ list | first }} 首或尾
floatformat {{ value | floatformat }} 浮点格式
get_digit {{ value | get_digit }} 位数
join {{ list | join: “,” }} 字符连接
make_list {{ value | make_list }} 转字符串
pluralize {{ number | pluralize }} 复数
random {{ list | random }} 随机
slice {{ list | slice: “:2” }} 切
slugify {{ title | slugify }} 转为slug
striptags {{ body | striptags }} 去除tags
time {{ value | time: “H:i” }} 时间格式
timesince {{ pub_date | timesince: given_date }}
truncatechars {{ title | truncatechars: 10 }}
truncatewords {{ title | truncatewords: 2 }}
truncatechars_html {{ title | truncatechars_html: 2 }}
urlencode {{ path | urlencode }} URL转义
wordcount
{{ body | wordcount }} 单词字数

模板标签Tags

在Django模板里,变量是放在双括号{{ }}里的,而代码是放在{% tag_name %}标签里的。Django里有很多自带标签,可以满足绝大部分开发需求。

标签Tags 例子
{% block %}
{% block content %} 代码块

{% endblock %}

{% csrf_token %} {% csrf_token %} 表单专用
{% for %}

  • {% for athlete in athlete_list %}
  • {{ athlete.name }}
  • {% endfor %}
{% for .. empty %}
  • {% for athlete in athlete_list %}
  • {{ athlete.name }}
  • {% empty %}
  • Sorry, no athletes。
  • {% endfor %}
{% if %} {% if title != "python" %} Not python. {% endif %}

{% if “hello” in greetings %}
Say hello
{% endif %}
{% url %}
{% url ‘blog:article_detail’ article.id %}
{% now %}
{% now “jS F Y H:i” %}
{% with %}
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
{% load %}

load tags and filters

{% load sometags library %}
{% include %}
{% include “header.html” %}
{% extends %}
{% extends “base.html” %}

模板的继承

Django支持模板的继承。你需要使用extends标签。在下面经典模板继承案例中,template.html中的content模块,会替换掉base.html中的content模块。同时template.html继承了base.html的sidebar和footer模块。

base.html

{% block sidebar %}
{% endblock %}

{% block content %}
{% endblock %}

{% block footer %}
{% endblock %}

template.html

{% extends “base.html” %}
{% block content %}
{{ some code }}
{% endblock }

模板文件base.html的位置

extends标签支持相对路径,这就意味着当文件夹结构如下所示时:

dir1/
template.html
base2.html
my/
base3.html
base1.html
模板template.html中以下继承方式都是可以的。

{% extends “./base2.html” %}
{% extends “…/base1.html” %}
{% extends “./my/base3.html” %}

模板文件加载静态文件

要在模板文件里加载静态文件如css文件和js文件,你一共有三步要走:

第一步: 先在你的app下新建一个static文件夹,然后把你需要静态文件放进去,推荐路径app/static/app/custom.css。

第二步: 在myproject/settings.py增加静态文件设置静态文件STATIC_URL。

STATIC_URL = ‘/static/’

第三步:在你的模板里使用{% load static %},如下所示。

{% load static %}

{% block title %} Django Web Applications {% endblock %}

如果你需要使用的静态文件不属于某个app,而属于整个项目project,那么你还可以定义静态文件文件夹列表。假设属于整个项目的静态文件放在/var/www/static/里,那么myproject/settings.py可以加入下面一行代码。

STATICFILES_DIRS = [
os.path.join(BASE_DIR, “static”),
‘/var/www/static/’,
]

本文里我们介绍Django模板的工作原理以及Django模板自带的标签和过滤器。我们还介绍了模板的继承以及如何在模板文件中使用静态文件。下次我们会介绍如何自定义模板的标签和过滤器。如果你喜欢我们的文章,欢迎关注我们的微信公众号【Python与Django大咖之路】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值