码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python Django 模版全解与实战


    合集 - python全景系列(29)
    1.<Python全景系列-1> Hello World,1分钟配置好你的python环境05-142.< Python全景系列-2 > Python数据类型大盘点05-153.< Python全景系列-3 > Python控制流程盘点及高级用法、神秘技巧大揭秘!05-174.< Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?05-185.< Python全景系列-5 > 解锁Python并发编程:多线程和多进程的神秘面纱揭晓05-216.< Python全景系列-6 > 掌握Python面向对象编程的关键:深度探索类与对象05-247.< Python全景系列-7 > 提升Python编程效率:模块与包全面解读05-258.< Python全景系列-8 > Python超薄感知,超强保护:异常处理的绝佳实践05-299.< Python全景系列-9 > Python 装饰器:优雅地增强你的函数和类05-3110.Python生成器深度解析:构建强大的数据处理管道06-0511.掌握Python文件操作:从基础到高阶的全方位探索06-1212.Python单元测试之道:从入门到精通的全面指南07-1813.深入探索 Django Rest Framework07-1314.跨越HTTP无状态边界:Cookie与Session在Django中的实战应用07-1115.Django ORM:最全面的数据库处理指南07-1016.详解Django请求与响应:深入理解Web Http交互的核心机制07-09
    17.Python Django 模版全解与实战07-08
    18.Django容易被遗忘却无比重要的框架默认文件介绍及使用方法07-0719.Python 爬虫实战:驾驭数据洪流,揭秘网页深处07-0620.Python史上最全种类数据库操作方法,你能想到的数据库类型都在里面!甚至还有云数据库!07-0521.Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!07-0422.Python Django Web开发实战06-3023.Python Flask - 快速构建Web应用详解06-2924.深入Python网络编程:从基础到实践06-2525.一文掌握Python多线程与多进程06-2026.Python正则表达式完全指南06-1327.Python的Lambda函数: 一把极简编程的瑞士军刀06-0828.Python 列表推导式:简洁、高效的数据操作艺术06-0729.Python日志模块:实战应用与最佳实践07-19
    收起

    本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构、标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实际项目的例子来演示如何在实际开发中使用Django模板系统。

    Django模板系统的简介

    Django模板系统是一个强大的组件,它允许我们根据所提供的数据动态生成HTML、XML等结构化文本。模板系统不仅易于使用,且功能丰富。它包括一个内置的语言:Django模板语言 (DTL),这是一种简单、非侵入式的语言,用于定义模板的结构和逻辑。

    例如,在一个Django模板中,我们可以使用变量和标签来动态地生成内容:

    # Django模板示例
    {{ book.title }} 
    {% if user.is_authenticated %} 
      Hello, {{ user.username }}! 
    {% endif %}
    

    以上代码中,花括号{{ }}用于输出变量的值,标签{% %}用于执行逻辑操作。


    模板的基本结构

    Django模板是由一系列特殊的语法构成的文本文件,用于动态生成HTML、XML或其他标记语言。下面我们来详细了解一下Django模板的基本结构。

    模板语法

    Django模板主要使用两种语法:

    • 变量:用双大括号({{ }})包裹。比如{{ variable }},Django将会将其替换为变量的值。
    • 标签:用大括号和百分号({% %})包裹。标签提供了模板的控制结构,比如循环、条件语句等。比如{% for item in list %}...{% endfor %}。

    模板继承

    Django模板系统支持模板继承。这是一种DRY(Don't Repeat Yourself)的设计原则。你可以定义一个基础模板(base template),然后让其他模板继承这个基础模板并覆盖其中的某些部分。

    例如,定义一个基础模板base.html:

    
    <html>
    <body>
    {% block content %}{% endblock %}
    body>
    html>
    

    然后,定义一个子模板child.html,继承base.html并覆盖content块:

    
    {% extends "base.html" %}
    
    {% block content %}
    <p>Hello, Django!p>
    {% endblock %}
    

    其他模板

    除了继承,Django模板还支持包含(include)其他模板,这可以帮助你将模板分解为小的、可重用的部分。

    例如,定义一个模板header.html:

    
    <header>
      <h1>Welcome to My Websiteh1>
    header>
    

    然后,在另一个模板中包含这个模板:

    {% include "header.html" %}
    
    <p>This is the main content...p>
    

    配置Django模板

    配置Django模板系统

    Django模板系统默认已经被包含在Django项目中。你可以在项目的settings.py文件中找到模板的配置信息:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [BASE_DIR / 'templates'],
            ...
        },
    ]
    

    你可以在'DIRS'配置项中添加模板的路径。默认情况下,Django会在每个应用的templates目录下查找模板文件。

    配置模板加载方式

    Django模板系统可以从多个位置加载模板。默认情况下,Django会在每个应用的templates目录下查找模板文件。你可以通过修改TEMPLATES配置中的'DIRS'选项来添加其他模板目录。例如,你可以添加一个全局的模板目录:

    # settings.py
    
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    TEMPLATES = [
        {
            ...
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            ...
        },
    ]
    

    在此配置中,所有的模板文件都会在项目根目录下的templates文件夹中查找。

    配置模板引擎

    在TEMPLATES配置中,'BACKEND'选项用于指定使用哪个模板引擎。Django默认使用的是自带的模板引擎,即django.template.backends.django.DjangoTemplates。你也可以切换到其他模板引擎,例如Jinja2:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',
            ...
        },
    ]
    

    注意,不同的模板引擎可能需要不同的配置,并且提供的模板语言也可能不同。

    配置自定义模板标签和过滤器

    如果你有自定义的模板标签和过滤器,你需要把它们放在某个应用下的templatetags目录中。然后在INSTALLED_APPS配置中添加该应用,Django就会自动加载你的自定义模板标签和过滤器:

    # settings.py
    
    INSTALLED_APPS = [
        ...
        'myapp',
        ...
    ]
    

    模板标签详解

    Django模板系统中的标签(Tags)提供了各种控制结构,包括循环、条件语句、模板继承等。接下来我们详细介绍一些常用的标签。

    for标签

    for标签用于在模板中循环遍历序列:

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

    if标签

    if标签用于条件判断。你可以使用elif和else进行多分支判断:

    {% if user.is_authenticated %}
        <p>Welcome back, {{ user.username }}.p> 
    {% else %}
        <p>Please log in.p> 
    {% endif %}
    

    extends标签和block标签

    extends标签用于模板继承,block标签用于定义可被子模板覆盖的区块:

    
    <html>
    <body>
    {% block content %}{% endblock %}
    body>
    html>
    
    
    {% extends "base.html" %}
    
    {% block content %}
    <p>Hello, Django!p>
    {% endblock %}
    

    include标签

    include标签用于包含其他模板,使得模板可重用:

    {% include "header.html" %}
    

    url标签

    url标签用于生成URL。它接受一个视图函数的名称或URL模式的名称,以及可选的参数,然后返回对应的URL:

    <a href="{% url 'home' %}">Homea> 
    

    csrf_token标签

    在使用POST表单时,csrf_token标签用于生成CSRF令牌,以防止跨站请求伪造攻击:

    <form method="post">
    {% csrf_token %}
    
    form>
    

    模板过滤器

    在Django模板中,过滤器可以在变量被显示之前对其进行修改。过滤器的语法是在变量名后面添加一个竖线(|)和过滤器的名称。如果过滤器需要参数,可以使用冒号(:)添加。让我们详细了解一下。

    基本使用

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

    {{ date_var|date:"F j, Y" }} 
    

    使用lower过滤器将文本转换为小写:

    {{ "Hello World"|lower }} 
    

    链接过滤器

    你还可以链接多个过滤器,他们会按照从左到右的顺序执行:

    {{ "Hello World"|lower|capfirst }} 
    

    自定义过滤器

    除了使用Django内置的过滤器,你还可以创建自己的过滤器。为此,你需要在某个应用下的templatetags目录中创建一个Python文件,然后在其中定义你的过滤器函数,并使用register.filter装饰器注册它:

    from django import template
    
    register = template.Library()
    
    @register.filter
    def my_filter(value):
        # 这是一个简单的过滤器,它返回值的第一个字符
        return value[0]
    

    然后你就可以在模板中使用这个过滤器了:

    {{ "Hello World"|my_filter }} 
    

    Django模板中展示模型数据

    Django框架将模型数据和模板视图分离,这让我们在模板中方便地展示模型数据。在视图函数中,我们可以查询模型数据,然后将它传递给模板。在模板中,我们使用特殊的语法来访问和展示这些数据。

    在视图中准备数据

    假设我们有一个Blog模型,它有一个title字段和一个content字段。在我们的视图函数中,我们可以查询所有的博客:

    from django.shortcuts import render
    from .models import Blog
    
    def blog_list(request):
        blogs = Blog.objects.all()  # 查询所有的博客
        return render(request, 'blog_list.html', {'blogs': blogs})
    

    在模板中展示数据

    然后,在我们的blog_list.html模板中,我们可以使用for标签来遍历所有的博客,并使用变量语法来展示每个博客的标题和内容:

    {% for blog in blogs %}
    <h2>{{ blog.title }}h2>  
    <p>{{ blog.content }}p>  
    {% endfor %}
    

    使用过滤器格式化数据

    在模板中,我们还可以使用过滤器来对模型数据进行格式化。例如,我们可以使用date过滤器来格式化日期,或者使用truncatechars过滤器来限制文本的长度:

    {% for blog in blogs %}
    <h2>{{ blog.title }}h2>
    <p>{{ blog.publish_date|date:"F j, Y" }}p>  
    <p>{{ blog.content|truncatechars:100 }}p>  
    {% endfor %}
    

    在实际的项目中使用Django模板

    Django模板系统在实际的项目开发中扮演着重要的角色。下面我们就以一个简单的博客系统作为例子,演示如何在实际项目中使用Django模板。

    第一步:定义你的模型

    首先,我们需要在我们的应用中定义一个模型。在这个例子中,我们定义一个Post模型来表示博客文章:

    from django.db import models
    
    class Post(models.Model):
        title = models.CharField(max_length=200)  # 文章标题
        content = models.TextField()  # 文章内容
        pub_date = models.DateTimeField(auto_now_add=True)  # 发布日期
    

    第二步:创建视图

    接着,我们需要创建一个视图来处理用户的请求。在这个视图中,我们可以获取所有的博客文章,并将它们传递给模板:

    from django.shortcuts import render
    from .models import Post
    
    def post_list(request):
        posts = Post.objects.all()  # 获取所有的博客文章
        return render(request, 'blog/post_list.html', {'posts': posts})  # 将文章传递给模板
    

    第三步:编写模板

    然后,我们可以创建一个模板来展示博客文章。在这个模板中,我们使用for标签来遍历所有的文章,并使用变量来展示文章的标题和内容:

    {% for post in posts %}
    <h2>{{ post.title }}h2>
    <p>{{ post.content }}p>
    <p>Published on {{ post.pub_date|date:"F j, Y" }}p>
    {% endfor %}
    

    第四步:配置URLs

    最后,我们需要在urls.py文件中配置URL,使得用户可以访问我们的视图:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('posts/', views.post_list, name='post_list'),  # 当用户访问/posts/时,显示博客文章列表
    ]
    

    以上就是在实际项目中使用Django模板的基本步骤。通过这个例子,我们可以看到Django模板系统的强大和灵活性,它可以帮助我们快速地创建动态的网页。


    如有帮助,请多关注
    个人微信公众号:【Python全视角】
    TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

  • 相关阅读:
    设计模式简介
    用信号量实现进程互斥, 同步, 前驱关系
    抖音小店“自然流量”和“达人带货”有什么区别?谁更适合新手?
    电脑系统还原怎么操作?
    mysql 创建视图提示View‘s SELECT contains a subquery in the FROM clause
    00、计算机视觉入门与调优简介
    前端性能优化
    VMware Workstation Pro16 的下载与安装
    oracle导出问题:ORA-00904: “POLTYP“: 标识符无效
    多肽标签Avi Tag,GLNDIFEAQKIEWHE
  • 原文地址:https://www.cnblogs.com/xfuture/p/17537479.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号