当前位置: 代码网 > it编程>前端脚本>Python > Django项目中static和templates目录的核心区别与使用方法

Django项目中static和templates目录的核心区别与使用方法

2026年08月19日 Python 我要评论
在django中,static 和 templates 目录的职责非常明确,理解它们的区别对于构建规范的django项目至关重要。一、template 目录template目录一般用于存放html模板

在django中,statictemplates 目录的职责非常明确,理解它们的区别对于构建规范的django项目至关重要。

一、template 目录

template目录一般用于存放html模板文件,django 模板系统用于将业务逻辑(python)与展示逻辑(html/css/js)分离,通过模板语言动态生成页面内容。其核心特性包括变量替换、标签控制和模板继承

1.1 模板语法基础

setting.py配置

在settings.py 的 templates 中添加下面字段,指定模板文件路径

templates = [
	{
		# ...
		'dirs': [os.path.join(base_dir, 'template')],
	}
]

模板使用

模板文件一般放在项目的template目录下,在该目录中创建一个index.html文件

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>django模板</title>
</head>
<body>
    <a>django模板</a>
</body>
</html>

在视图views.py文件中,可以直接返回template 里面的文件

from django.shortcuts import render

def index(request):
    # 参数1: 当前的请求  参数2: 模板文件
    return render(request, 'index.html')

1.2 变量与标签使用

如果要将数据传入到index.html中,在index.html中可以使用{{ data }}接收数据传入变量(运算符两侧必须要有空格),如果涉及循环或条件判断,则可以使用{% tag %}标签

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>django模板</title>
</head>
<body>
		<!-- 变量 -->
    <a>{{ name }}</a>
		<!-- 索引 -->
    <a>{{ books.1 }}</a>
    
    <ul>
		<!-- 标签:遍历读取 -->
        {% for book in books %}
            <li>{{ book }}</li>
        {% endfor %}
    </ul>
    
    
    <!-- 标签:条件判断 -->
	{% if age >10 %}
	    大于10岁
	{% else %}
	    不大于10岁
	{% endif %}
</body>
</html>

接着修改views.py,通过context 将数据传入html中(这里的name是下面传入字典的键,得到的就是下面传入的字典的值python)

from django.shortcuts import render
from django.http import httpresponse

def index(request):
    # 参数1: 当前的请求   参数2: 模板文件   参数3:context传递参
    return render(request, 'index.html', context={'name': 'python', 'book': ['aa', 'bb'], 'age': 10})

1.3 过滤器(默认值、日期格式等)

语法:{{ 变量|过滤器:参数 }}

过滤器含义
default默认值
(如果变量不存在时则返回默认值 date|default:'默认值'
length长度
(返回字符丰包含字符的个数,或列表、元组、字典的元素个数)
safe转义
(返回内容为html当存文本处理,使用转义可转为存文本)
date日期
(用于对日期类型的值进行字符串格式化 value|data:"y年m月j日 h时i分s秒"
日期格式化字符含义解释
y格式4位(y两位)
m01,02,12
d01,02
j1,2
h24小时制(h12小时制)
i0-59
s0-59

举例

from django.shortcuts import render
from django.views import view
import datetime

class homeview(view):
    def get(self,request):
        username = request.get.get('username')
        context = {
            'datetime': datetime.datetime.now(),
        }
        return render(request, 'index.html', context=context)
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>title</title>
</head>
<body>
日期:{{ datetime|date:'y m d' }}
</body>
</html>

1.4 模板继承

当某些内容在多个页面中公用时,可以使用模板继承的方法,常用于 header 和 footer 部分

父标签

我们可以建立一个基础的文件 base.html,供下方使用,这里使用block标签在父模板中预留区域,在子模板中将其替换填充差异性的内容。预留区域也可以直接填写内容(即默认内容),当子模块未填充的时候,则使用这里的默认内容

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>{% block title %}title{% endblock title %}</title>
</head>
<body>
{% block header %}
<h1>顶部</h1>
{% endblock header %}
{% block main %}
<h1>主要部分</h1>
{% endblock main %}
{% block footer %}
<h1>底部</h1>
{% endblock footer %}
</body>
</html>

子标签

在子模块中,可以在第一行使用标签extends将父标签导入进来,然后使用 block标签 填写该区域对应的内容。子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值

{% extends 'base.html' %}
{% block title %}
替换标题
{% endblock title %}
{% block main %}
<a href="">替换主体</a>
{% endblock main %}
{% block footer %}{% endblock %}

1.5 jinja2模板

jinja2是 python 下的一个被广泛应用的模板引擎,是由python实现的模板语言,他的设计思想来源于django的模板引擎,并扩展了其语法和一系列强大的功能,尤其是flask框架内置的模板语言。由于django默认模板引擎功能不齐全,速度慢,所以我们也可以在django中使用jinja2,jinja2宣称比django默认模板引擎快10-20倍。django主流的第三方app基本上也都同时支持diango默认模板及inja2,所以要用inia2也不会有多少障碍。

jinja2模板安装pip install jinja2
jiaja2配置:在settings.py中配置

templates = [
    {
        # 'backend': 'django.template.backends.django.djangotemplates',  # 默认引擎
        'backend': 'django.template.backends.jinja2.jinja2',  # 修改为jinja2模板
        'dirs': [os.path.join(base_dir, 'template')],
        'app_dirs': true,
        'options': {
            'environment': 'jinja2.environment',  # 添加这行  默认的,可加可不加
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },# 如果报错,原始的代码复制到下面
    {
        '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',
            ],
        },
    },
]

如果还是按之前的方式来使用,这里可能会出现错误

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>title</title>
</head>
<body>
日期:{{ datetime|date:'y m d' }}
</body>
</html>

这是因为jiaja2的语法和上面模板的语法有些区别,区别在于过滤器不同,上面的模板是forloop,jiaja2是loop

jiaja2过滤器

优化后的内容如下

<body>
日期:{{ date(datetime) }}
</body>
from django.views import view
import datetime

class homeview(view):
    def get(self,request):
        context = {
            'datetime': datetime.datetime.now(),
        }
        return render(request, 'index.html', context=context)

接着在子应用中创建jinja2_env.py文件,内容如下(否则会显示date未定义)

from django.template.defaultfilters import date
from jinja2 import environment

def environment(**option):
    # 1.创建environment实例
    env = environment(**option)
    # 2.指定jinja2的函数指向django的指定过滤器
    env.globals.update({
        'date': date
    })
    # 3.返回environment实例
    return env

然后修改配置 settings.py,改为调用自己定义的,改完之后就可以正常访问

templates = [
    {
        # 'backend': 'django.template.backends.django.djangotemplates',  # 默认引擎
        'backend': 'django.template.backends.jinja2.jinja2',  # 修改为jinja2模板
        'dirs': [os.path.join(base_dir, 'template')],
        'app_dirs': true,
        'options': {
            # 'environment': 'jinja2.environment',  # 添加这行  默认的,可加可不加
            'environment': 'book.jinja2_env.environment',  # 指定jinja2的环境
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },# 如果报错,原始的代码复制到下面
    {
        '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',
            ],
        },
    },
]

要显示特定的格式,在后面和之前一样添加参数

<body>

日期:{{ date(datetime,'y m d') }}
</body>

自定义过滤器

from jinja2 import environment

def environment(**option):
    # 1.创建environment实例
    env = environment(**option)
    # 2.将自定义过滤器添加到环境中
    env.filters['do_listreverse'] = do_listreverse
    # 3.返回environment实例
    return env

# 自定义过滤器
def do_listreverse(li):
    if li == 'b':
        return "abcd"

二、static目录(静态文件)

static 目录一般用于存放静态资源文件,这些是html中引用的、不需要动态处理的资源文件。

setting.py 配置

配置 settings.py 文件,指定静态文件所存放路径

# django通过static_ur区分静态资源和动态资源
# 定义模板中引用静态文件时的url前缀
static_url = 'static/'
# 指定项目级别的静态文件目录,base_dir变量在该文件上面有定义
staticfiles_dirs = [
    os.path.join(base_dir, 'static')
]

如果静态文件目录存在图片,运行时访问http://127.0.0.1:8000/static/1.jpeg就会出现static中的图片

模板文件中引用静态文件

加载static模板标签:在html文件顶部加载static模板标签
引用静态文件的路径:使用{% static %}模板标签生成完整路径

{% load static %}
<!doctype html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'myapp/css/style.css' %}" rel="external nofollow" >
</head>
<body>
    <script src="{% static 'myapp/js/script.js' %}"></script>
</body>
</html>

以上就是django项目中static和templates目录的核心区别与使用方法的详细内容,更多关于django static和templates目录区别与使用的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com