Django 笔记4 -- 模板

Django 笔记4 – 模板


Django 系列笔记是笔者学习、实践使用 Django 的相关笔记,大量参考了知了课堂的《Django零基础到项目实战》教程。

参考文档:
Django官方文档(英文)
Django 中文文档


一、模板


1、模板查找路径配置

配置TEMPLATES:

项目的settings.py文件中,有一个 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',
            ],
        },
    },
]

DIRS: 一个列表,在这个列表中可以存放所有的模板路径,以后在视图中使用 render 或者 render_to_string 渲染模板的时候,会在这个列表的路径中查找模板。

APP_DIRS: 默认为True,这个设置为True后,会在 INSTALLED_APPS 的安装了的APP下的 templates 目录中查找模板。

查找顺序: 查找一个模板,先在 DIRS 这个列表中依次查找路径下有没有这个模板,如果有,就返回。如果DIRS列表中所有的路径都没有找到,那么会先检查当前这个视图所处的 app 是否已经安装,如果已经安装了,那么就先在当前这个 app 下的 templates 文件夹中查找模板,如果没有找到,那么会在其他已经安装了的 app 中查找。如果所有路径下都没有找到,那么会抛出一个 TemplateDoesNotExist 的异常。

2、渲染模板

render_to_string():

from django.template.loader import render_to_string
from django.http import HttpResponse

# 将模板编译后渲染成Python的字符串格式后,再包装成HttpResponse对象
html = render_to_string("detail.html")
return HttpResponse(html)

render():

from django.shortcuts import render

# 直接将模板渲染成字符串并包装成HttpResponse对象
return render(request,'list.html')

二、DTL 模板


1、变量

  • Django 在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的命名规范和 Python 非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。变量需要通过视图函数渲染,视图函数在使用 render 或者render_to_string 的时候可以传递一个 context 的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的。
  • 模板中使用变量,格式:{{ key }}
  • key 是一个字典,通过 key.key 得到 key 这个字典的键对应的值
  • key 是一个对象,通过 key.xx 得到 key 这个对象的 xx 属性/方法。
  • key 是一个列表/元组,通过 key.1,得到 key 这个列表/元组的第1个值
  • 如果 key 中没有指定的东西,返回一个空的字符串
# html 模板代码,profile.html
<p>{{ username }}</p>

# 视图函数代码
def view(request):
    return render(request, 'profile.html',context={'username':'huangyong'})

2、模板标签

if标签: if标签中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判断运算符。

 {% if  .....  %}
     <p> .... </p>
 {% else %}
     <p> .... </p>
 {% endif %}

for…in…标签: 可以遍历列表、元组、字符串、字典等一切可以遍历的对象

  • forloop.counter:当前循环的下标,以1作为起始值。
  • forloop.counter0:当前循环的下标,以0作为起始值。
  • forloop.first:是否是第一次遍历。
  • forloop.last:是否是最后一次遍历。
{% for ... in ... %}
     <p>{{ ... }}</p>
 {% endfor %}

**for…in…empty标签:**遍历的对象如果没有元素的情况下,会执行empty中的内容

{% for ... in ... %}
     ...
 {% empty %}
     ...
 {% endfor %}

with标签: 复杂的变量缓存到一个变量上

 {% with 变量名=复杂的变量 %}
     <p>{{ 变量名 }}</p>
 {% endwith %}

url标签: url反转,通常用于 href 属性

<a href="{% url '视图函数' %}"> ... </a>

# url反转,使用关键字参数
<a href="{% url '视图函数' key=value %}">图书

3、模版过滤器

通过滤器可以对数据进行处理,类似于函数

add 过滤器: 变量加上一个值

{{ name |add: 'value' }}

date 过滤器: 日期转化成指定格式的字符串

# 数据
context = {"birthday": datetime.now()}

# 转化成 2018-01-01 格式
{{ birthday|date:"Y-m-d" }}

length 过滤器: 获取一个列表/元组/字符串/字典的长度

{{ list|length }}

4、模板继承

父模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# 开一个口,子模板中自定义 #}
    {% block main %}{% endblock %}

    {# 也可以写成下面这样,更明了 #}
    {% block main %}{% endblock main %}
</body>
</html>

子模板:

# 指定继承与那个模板
{% extends "base.html" %}

# 选择父模板中开的口子,自定义内容
{% block main %}自定义内容{% endblock %}


三、加载静态文件


1、静态文件

在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件,js 执行文件以及图片等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载静态文件。要使用 static 标签格式 {% load static %}。

2、静态文件路径配置

  1. 首先确保 django.contrib.staticfiles 已经添加到settings.INSTALLED_APPS中。
  2. 确保在settings.py中设置了STATIC_URL。
  3. 在已经安装了的 app 下创建一个文件夹叫做 static,然后再在这个 static 文件夹下创建一个当前app的名字的文件夹,再把静态文件放到这个文件夹下(如果直接把静态文件放在 static 文件夹下,在多个 app 之间有同名的静态文件时可能就会产生混淆)。
  4. 如果有一些静态文件是不和任何app挂钩的。那么可以在 settings.py 中添加 STATICFILES_DIRS,以后 DTL 就会在这个列表的路径中查找静态文件。
     STATICFILES_DIRS = [
         # 项目根目录下的 static 文件夹
         os.path.join(BASE_DIR,"static")
     ]
    
  5. 在模版中使用 load 标签加载 static 标签,就可以直接使用 static 文件夹下的静态文件。
     {% load static %}
     <link rel="stylesheet" href="{% static 'style.css' %}">
    
  6. 如果不想每次在模版中加载静态文件都使用 load 加载 static 标签,那么可以在 settings.py 中的 TEMPLATES.OPTIONS中 添加'builtins':['django.templatetags.static'],这样以后在模版中就可以直接使用 static 标签,而不用手动 load。
  7. 如果没有在 settings.INSTALLED_APPS 中添加 django.contrib.staticfiles。那么我们就需要手动的将请求静态文件的 url 与静态文件的路径进行映射了。
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # 其他的url映射
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

GOOD LUCK!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值