Python web实战之 Django 的模板语言详解

news2024/11/13 8:59:14

7dc92772fec24af78bf9656d4efee361.png


关键词:

Python、web开发、Django、模板语言

 


概要

 

作为 Python Web 开发的框架之一,Django 提供了一套完整的 MVC 模式,其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。

 

1. Django 模板语言入门

Django 的模板语言是一种基于 HTML 的模板语言,它提供了丰富的标签和过滤器来帮助开发者实现前端渲染和逻辑控制。在使用模板语言之前,我们需要先了解 Django 的模板文件结构和渲染方式。

1.1 模板文件的结构

在 Django 中,模板文件通常存放在应用的 templates 目录下。一个模板文件通常由以下几部分组成:

  • 模板头部:包含模板引用其他文件、定义模板块等信息。

  • 模板主体:包含实际的 HTML 代码和模板标签。

  • 模板尾部:包含 JavaScript 代码、CSS 样式等信息。

通常情况下,我们只需要编写模板主体部分,而头部和尾部可以使用已有的模板文件或者框架提供的默认模板。

1.2 模板的渲染方式

在 Django 中,模板文件可以通过视图函数中的 render 函数进行渲染,例如:

from django.shortcuts import render

def index(request):
    context = {'title': 'Hello World!'}
    return render(request, 'index.html', context)

在 render 函数中,第一个参数是请求对象,第二个参数是模板文件名,第三个参数是传递给模板的上下文变量。在模板中,我们可以通过变量名来访问上下文变量,例如:

<h1>{{ title }}</h1>

在模板渲染时,Django 会将模板中的变量替换为上下文变量的值,并执行模板标签和过滤器。

 

2. Django 模板语言进阶

除了简单的变量渲染,Django 的模板语言还提供了丰富的标签和过滤器来实现逻辑控制和数据处理。下面我们将介绍一些常用的模板标签和过滤器。

2.1 模板标签

Django 的模板标签可以实现逻辑控制和数据处理,常用的标签包括:

  • if 标签:用于条件判断。

  • for 标签:用于循环迭代。

  • include 标签:用于引入其他模板文件。

  • block 和 extends 标签:用于模板继承和重载。

  • url 标签:用于生成 URL。

例如,我们可以使用 if 标签来判断一个变量是否为空:

{% if variable %}
    <p>{{ variable }}</p>
{% else %}
    <p>Variable is empty.</p>
{% endif %}

使用 for 标签来循环迭代一个列表:

{% for item in list %}
    <li>{{ item }}</li>
{% endfor %}

使用 include 标签引入其他模板文件:

{% include 'header.html' %}

当我们需要在多个页面中使用相同的 HTML 结构时,可以使用 Django 的模板继承和重载功能,减少代码重复和维护成本。

先创建一个基础模板文件 base.html,定义共用的 HTML 结构和 CSS 样式:

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="header">
        {% block header %}{% endblock %}
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
    <div id="footer">
        {% block footer %}{% endblock %}
    </div>
</body>
</html>

在这个模板中,使用了 block 标签来定义可重载的区域。例如 {% block title %}{% endblock %} 定义了一个名为 title 的区域,该区域可以在子模板中被重载。

接下来创建一个子模板文件 child.html,继承 base.html 并重载其中的区域:

{% extends 'base.html' %}

{% block title %}Child Page{% endblock %}

{% block header %}
    <h1>Child Header</h1>
{% endblock %}

{% block content %}
    <p>Child Content</p>
{% endblock %}

在该模板中,我们使用 extends 标签来继承 base.html,并使用 block 标签重载了 title、header 和 content 区域。在渲染该模板时,Django 会自动将子模板中重载的区域插入到父模板中对应的位置,最终生成完整的 HTML 页面。

通过模板继承和重载功能,我们可以更加方便地管理和维护大型 Web 应用程序中的 HTML 结构和样式。

2.2 模板过滤器

Django 的模板过滤器可以对变量进行处理和格式化,常用的过滤器包括:

  • date:用于格式化日期。

  • length:用于获取列表长度。

  • upper 和 lower:用于将字符串转换为大写和小写。

  • join:用于将列表转换为字符串。

  • default:用于设置默认值。

例如,可以使用 date 过滤器来格式化日期:

<p>{{ date|date:"Y-m-d" }}</p>

使用 length 过滤器获取列表长度:

<p>{{ list|length }}</p>

使用 upper 和 lower 过滤器将字符串转换为大写和小写:

<p>{{ string|upper }}</p>
<p>{{ string|lower }}</p>

将日期格式化为指定的字符串。

  <p>{{ post.pub_date|date:"F j, Y" }}</p>

截取列表的一部分元素。

  <ul>
  {% for item in items|slice:":3" %}
      <li>{{ item }}</li>
  {% endfor %}
  </ul>

将文本中的URL自动转化为链接。

  <p>{{ post.content|urlize }}</p>

 

3. Django 模板语言实战

在实际的 Web 开发中,我们经常需要使用 Django 的模板语言来实现一些常用的功能。下面介绍几个实用的实战案例。

3.1 分页功能

在列表页面中,通常需要实现分页功能。Django 提供了内置的分页模块,可以帮助我们快速实现分页功能。首先,需要在视图函数中引入分页模块:

from django.core.paginator import Paginator

def list(request):
    items = Item.objects.all()
    paginator = Paginator(items, 10)
    page = request.GET.get('page')
    items = paginator.get_page(page)
    return render(request, 'list.html', {'items': items})

在模板中,可以使用分页模块提供的标签和过滤器来实现分页功能:

{% for item in items %}
    <p>{{ item.name }}</p>
{% endfor %}

{% if items.has_previous %}
    <a href="?page={{ items.previous_page_number }}">上一页</a>
{% endif %}

{% for i in items.paginator.page_range %}
    {% if items.number == i %}
        <strong>{{ i }}</strong>
    {% else %}
        <a href="?page={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

{% if items.has_next %}
    <a href="?page={{ items.next_page_number }}">下一页</a>
{% endif %}

3.2 表单验证功能

在表单页面通常需要验证用户输入的数据是否合法。Django 提供了内置的表单验证模块,可以帮助我们快速实现表单验证功能。首先需要定义一个表单类:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

这里定义了一个名为 ContactForm 的表单类,其中包含三个字段:name、email 和 message。name 字段使用了 CharField 类来验证用户输入的姓名,限制最大长度为 50 个字符;email 字段使用了 EmailField 类来验证用户输入的电子邮件地址,确保其符合电子邮件地址的格式;message 字段使用了 CharField 类,并使用了 Textarea 组件来允许用户输入多行文本信息。

在视图函数中,我们可以使用表单验证模块来验证用户输入的数据:

from django.shortcuts import render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理用户输入的数据
            return HttpResponseRedirect('/thanks/')
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

在模板中,我们可以使用表单模块提供的标签和过滤器来快速渲染表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

 

技术总结

本文章介绍了 Django 的模板语言,包括模板文件的结构、模板的渲染方式、常用的模板标签和过滤器,以及实用的实战案例。

 

如果文章对你有所帮助,欢迎点赞收藏转发,感谢🙏

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神策新一代分析引擎架构演进

近日&#xff0c;神策数据已经推出全新的神策分析 2.5 版本&#xff0c;该版本支持分析模型与外部数据的融合性接入&#xff0c;构建全域数据融合模型&#xff0c;实现从用户到经营的全链路、全场景分析。新版本的神策分析能够为企业提供更全面、更有效的市场信息和经营策略&am…

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品规格

目录 节点类型 节点数量 节点规格 腾讯云向量数据库(Tencent Cloud VectorDB)采用分布式部署架构,每个节点相互通信和协调,实现数据存储与检索。客户端请求通过 Load balance 分发到各节点上。具体信息,请参见 产品架构。 节点类型 腾讯云向量数据库依据存储节点 CPU …

A02_启动测速和切换站点

一 业务功能 二 问题 三 业务流程 1 初始化网络 2 测速选站点 3 拉取站点 4 手动切换站点 四 重点代码 public class StationMeasure {private static final String TEST_STATION_URL "/test/ips";private static final String STATION_URL "/product/ips&…

鸟哥马哥共叙Linux发展

导读北京时间3月28日&#xff0c;由51CTO学院和人民邮电出版社信息技术分社联合举办的[开放见远]“鸟哥”大陆行Linux技术沙龙在位于北京市西三环久凌大厦的51CTO学院举行。 台湾著名Linux网站——“鸟哥的Linux私房菜”站长蔡德明&#xff0c;51CTO学院讲师马哥教育创始人马永…

EasyRecovery15简体中文个人版专业手机数据恢复软件

EasyRecovery15数据恢复软件是一款文件恢复软件&#xff0c;能够恢复内容类型非常多&#xff0c;包括办公文档、文件夹、电子邮件、照片、音频等一些常用文件类型都是可以进行恢复&#xff0c;操作非常简单&#xff0c;只需要将存储设备连接到电脑上&#xff0c;运行EasyRecove…

异常(上)概述,捕捉异常,try-catch语句的详细使用

文章目录 前言一、异常是什么&#xff1f;二、捕捉异常 1.自动捕捉异常2.try-catch语句捕捉异常 a.多重try-catch代码块b.异常的中断机制c.finally代码块恢复机制总结 前言 该文介绍了Java异常的概述&#xff0c;运行代码时&#xff0c;异常的捕捉&#xff0c;及其使用 try-cat…

QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 始篇

文章目录 QT图形视图系统介绍开始搭建MainWindow框架设置scene的属性缩放功能的添加加上标尺 QT图形视图系统 介绍 详细的介绍可以看QT的官方助手&#xff0c;那里面介绍的详细且明白&#xff0c;需要一定的英语基础&#xff0c;我这里直接使用一个开源项目来介绍QGraphicsVi…

leetcode 738. 单调递增的数字

2023.8.4 这题用暴力法会超时&#xff0c;我就没试了&#xff0c;采用了个挺巧的方法&#xff0c;为了方便需要先将整数n转换为字符串的形式&#xff0c;然后从后向前遍历&#xff0c;当两个数字非递增时&#xff0c;将前一个数字--&#xff0c;后一个数字的位置记录在index中&…

路由的hash和history模式的区别

目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的&#xff0c;它的目标是不刷新整体页面&#xff0c;通过地址栏中的变化来决定内容区…

Three.js 创建网格辅助线,坐标轴辅助线,模型骨骼辅助线

three.js中的辅助线使用 1.网格辅助线&#xff08;GridHelper&#xff09; 2.坐标轴辅助线&#xff08;AxesHelper&#xff09; 3.模型骨骼辅助线(SkeletonHelper) 在上一篇 Three.js加载外部glb,fbx,gltf,obj 模型文件 的文章基础上新加入一个创建 辅助线的函数 createHel…

原型链污染例题复现

一、什么是原型链 下面我们通过这个小例子来看看。 可以看到b在实例化为test对象以后&#xff0c;就可以输出test类中的属性a了。这是因为在于js中的一个重要的概念&#xff1a;继承。而继承的整个过程就称为该类的原型链。 在javascript中,每个对象的都有一个指向他的原型(p…

CRM系统哪些功能可以个性化定制?

不同的企业有着不同的业务流程和需求&#xff0c;因此在选型时就需要一款可以个性化定制的CRM系统。下面说说可以个性化定制的CRM系统的功能和优势。 如何实现个性化定制&#xff1f; Zoho CRM支持个性化定制&#xff0c;您可以创建自定义功能模块、字段以及业务流程&#xf…

还在人工管理?太傻了!建筑行业高手给你支一招!

在现代科技日益发展的时代&#xff0c;智慧工地成为建筑行业的新兴趋势。借助先进的技术和数字化解决方案&#xff0c;智慧工地为建筑项目带来了前所未有的效率、安全性和可持续性。 智慧工地不仅提高了建筑施工的效率&#xff0c;也为管理人员提供了更好的决策依据和风险预测能…

MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图

MQTT 概述 MQTT (Message Queue Telemetry Transport) 是一个轻量级传输协议&#xff0c;它被设计用于轻量级的发布/订阅式消息传输&#xff0c;MQTT协议针对低带宽网络&#xff0c;低计算能力的设备&#xff0c;做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息…

DLL的引入方式(DllImport的特殊引入方式)

Dll引入方式有四种&#xff1a; 1.就是普通的比如一个解决方案中有多个项目&#xff0c;将其他项目的引入到该项目中 2.就是软件自带的程序集的引入 3.就是使用dll的引入&#xff08;普通的本身就是VS的dll文件&#xff09; 4.就是使用dll的引入&#xff08;不是属于该语言的…

网络音频终端音频编码解码终端

网络对讲终端SV-7011V 网络对讲终端SV-7011V&#xff0c;采用了ARM音频DSP架构&#xff0c;集网络对讲、网络广播、监听等功能于一身&#xff0c;内置麦克风、配置line out、line in、Mic in功能输出接口&#xff0c;适用于学校&#xff0c;机场&#xff0c;广场等场所。 产品…

解决 MySQL 删除数据后,ID 自增不连续问题

修复前 除了部分数据&#xff0c;导致后续新增的数据&#xff0c;ID 自增不连续 解决方案 执行下方 SQL 语句即可修复此问题&#xff0c;mbs_order为需要修复的表名 SET i0; UPDATE mbs_order SET id(i:i1); ALTER TABLE mbs_order AUTO_INCREMENT0;

NetApp 入门级全闪存系统 AFF A250:小巧而强大

NetApp 入门级全闪存系统 AFF A250&#xff1a;小巧而强大 作为 AFF A 系列中的入门级全闪存系统&#xff0c;AFF A250 不但可以简化数据管理&#xff0c;还能为您的所有工作负载提供令人惊叹的强劲动力&#xff0c;价格也平易近人。 AFF A250&#xff1a;您的新 IT 专家 AFF…

指向字符串常量(字符串右值)的char指针,free的时候为什么会报错?

起因是如下代码 char *p "abc"; free(p);先说结果&#xff0c;这里会报错&#xff0c;会报一个错误如下 一开始还没反应过来&#xff0c;只知道 “test_content” 是一个右值&#xff0c;这是一个指向右值的指针。 但是free的时候为什么会报错呢&#xff1f; 首…

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容&#xff1a;微卡、小卡、中卡、大卡&#xff0c;根据不同卡片特征显示同一个字的不同内容&#xff0c;基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新&#xff1a;用户点击卡片刷新按钮查看新内容&#xff0c;同时…