详解Python的Django框架中的模版相关知识

yizhihongxing

详解Python的Django框架中的模版相关知识

Django 是一个优秀的 Python Web 框架,内置了强大的模版引擎,方便开发者快速创建 Web 应用。本文将详细讲解 Django 中与模版相关的知识,包括模版的语法、模版继承和自定义模版标签等内容。同时,本文将提供两个示例来说明 Django 模版相关知识的应用。

模版的语法

Django 模版语言支持丰富的语法,既可以使用变量、标签,也可以使用条件控制语句和循环语句等。下面是一些常用的语法:

变量

使用双花括号 {{ }} 包含变量名,可以在模版中输出变量的值。

<p>{{ name }}</p>

标签

使用花括号与百分号 {% %} 包含标签名,可以在模版中使用系统提供的标签,例如 forifelse 等条件控制和循环语句。同时,Django 还提供了一些方便的标签,例如 extendsinclude 等。

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

注释

使用花括号、百分号和井号 {% # %} 包含注释内容。

{% comment %}
  This is a comment.
{% endcomment %}

过滤器

变量也可以通过在后面加上管道符 | 和一个过滤器修改输出的内容。常用的过滤器有 upperlowerlength 等。

<p>{{ name|upper }}</p>

模版继承

模版继承是 Django 中一个非常重要的概念,它允许用户定义一个基础模版,并在子模版中重写部分内容,方便用户重用代码。下面是一个示例:

创建一个 base.html 文件,定义一个基础模版。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>{% block title %}Page Title{% endblock %}</title>
</head>
<body>
  <div class="container">
    {% block content %}
    {% endblock %}
  </div>
</body>
</html>

base.html 中定义了两个 block,分别是 titlecontent。使用 {% block %}{% endblock %} 来定义 block。

创建一个 page.html 文件,继承 base.html 并重写其中的某部分。

{% extends 'base.html' %}

{% block title %}
  My Page Title
{% endblock %}

{% block content %}
  <h1>Hello, World</h1>
{% endblock %}

page.html 中使用 {% extends %} 继承 base.html,并重写 titlecontent 的 block。这样,page.html 就继承了 base.html 的基础模版,并覆盖了其中的 titlecontent

自定义模版标签

Django 还允许用户自己定义模版标签,从而扩展模版引擎的功能。下面是一个示例:

创建一个 custom_tags.py 文件,定义一个自定义标签函数。

from django import template

register = template.Library()

@register.simple_tag
def hello():
    return "Hello, World!"

custom_tags.py 中定义了一个 hello 函数,并使用 @register.simple_tag 装饰器将其注册到模版引擎中。

在模版中使用这个自定义标签。

{% load custom_tags %}

<p>{% hello %}</p>

使用 {% load %} 标签加载自定义标签库,并使用 {% hello %} 标签调用自定义标签函数。

示例说明

示例 1

在一个电商网站中,需要对某些商品进行特殊标识,例如打折商品、新品上市等。为了方便管理,网站管理员将这些标识存储在数据库中,通过 Django 模版引擎来渲染页面。

在数据库中添加一个商品标识的表(item_flag),示例数据如下:

id name icon
1 打折商品 优惠
2 新品上市 新品

在 Django 中定义一个自定义标签 (get_item_flag) 来获取商品对应的标识。

@register.simple_tag
def get_item_flag(item_id):
    flag = ItemFlag.objects.filter(item_id=item_id).first()
    if flag:
        return flag.icon
    else:
        return ''

在模版中使用这个自定义标签和 Django 原生标签实现商品标识的显示:

{% load custom_tags %}
{% for item in items %}
  <div class="item">
    <p>{{ item.name }}</p>
    {% if item.price < 100 %}
      <p><span class="discount">{% get_item_flag item.id %}</span> {{ item.price }}</p>
    {% else %}
      <p>{{ item.price }}</p>
    {% endif %}
  </div>
{% endfor %}

以上代码中,{% get_item_flag item.id %} 标签获取商品对应的标识,并在 <span> 标签中显示。同时,原生标签 {% if %} 也使用来判断商品是否需要打折显示。

示例 2

在一个博客网站中,有不同的文章类型,例如技术文章、生活随笔等。每种文章类型需要有不同的侧边栏广告。为了方便管理,网站管理员将这些广告存储在数据库中,通过 Django 模版引擎来渲染页面。

在数据库中添加一个广告表 (ad),示例数据如下:

id type content
1 技术文章 技术资讯:5G进入全球商用
2 生活随笔 闲话家常:我家的小狗小猫

在 Django 中定义一个自定义标签 (get_ad) 来获取当前文章类型对应的广告。

@register.simple_tag(takes_context=True)
def get_ad(context):
    ad_type = context.get('ad_type')
    ad = Ad.objects.filter(type=ad_type).first()
    if ad:
        return ad.content
    else:
        return ''

在模版中使用这个自定义标签和 Django 原生标签实现对应类型广告的显示:

{% load custom_tags %}
{% block sidebar %}
  {% if article_type == '技术文章' %}
    <div class="ad">{{% get_ad ad_type='技术文章' %}}</div>
  {% elif article_type == '生活随笔' %}
    <div class="ad">{{% get_ad ad_type='生活随笔' %}}</div>
  {% endif %}
{% endblock %}

以上代码中,{% get_ad ad_type='技术文章' %} 标签根据广告类型获取对应的广告,并在 <div> 标签中显示。同时,原生标签 {% if %} 也使用来判断显示哪种类型广告。

总结

Django 模版是 Django 框架中非常重要的一部分,了解模版语法和模版继承等知识有助于开发高效、高质的 Web 应用。同时,自定义模版标签也是模版引擎功能扩展的一个必要手段,方便开发者进行更加定制化的需求实现。以上两个示例说明了使用 Django 模版的实际应用场景,同时展示了如何使用模版语法、继承和自定义标签等功能实现项目需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python的Django框架中的模版相关知识 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django-rest-framework框架 第四篇 认证Authentication

    认证Authentication 什么是身份认证 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或与其签名的令牌)关联的机制。 视图的最开始处运行身份验证 在权限和限制检查发生之前,以及在允许继续执行任何其他代码之前,始终在视图的最开始处运行身份验证。 身份验证方案总是定义为类的列表 REST框架尝试对列表中的每个类进行身份验证,并将成功身份验证的第…

    Django 2023年4月11日
    00
  • Django之多对多查询与操作方法详解

    Django之多对多查询与操作方法详解 在Django中,多对多关系是非常常见且重要的关系之一,学习多对多查询与操作方法对于开发Django应用程序非常有用。下面将对多对多关系的查询及操作方法进行详细讲解。 多对多查询 多对多查询的核心在于通过中间表进行查询。在Django中,对于多对多关系,会默认生成一个中间表来连接两个相关的模型类。假设有两个模型类Boo…

    Django 2023年5月16日
    00
  • 如何在django中添加日志功能

    在Django的应用程序中,添加日志功能是一个很好的实践,因为它可以帮助你更好地了解应用程序的运行情况,发现和调试问题。下面是完整的攻略,包括了添加日志的步骤和示例代码。 第一步:设置logging配置 在Django项目的设置中,需要设置logging配置,以便日志记录器能够写入日志文件。 LOGGING = { ‘version’: 1, ‘disabl…

    Django 2023年5月16日
    00
  • Django Rest Framework之版本控制

    settings.py: REST_FRAMEWORK = { ‘DEFAULT_VERSION’: ‘v1’, # 默认版本 ‘ALLOWED_VERSIONS’: [‘v1’, ‘v2’], # 允许的版本 ‘VERSION_PARAM’: ‘version’ # URL中获取值的key }  urls.py: from django.conf.urls…

    2023年4月9日
    00
  • Django 内置权限扩展案例详解

    这里是针对“Django 内置权限扩展案例详解”的完整攻略,包含两个示例说明的详细讲解。 1. 示例一 1.1 案例描述 假设我们要实现一个博客系统,需要实现以下功能: 所有用户都可以浏览博客列表和单篇博客。 未登录用户不能对博客进行任何操作(包括新建、修改、删除和点赞)。 登录用户可以进行以下操作: 创建自己的博客文章。 修改自己创建的博客文章。 删除自己…

    Django 2023年5月16日
    00
  • Django信号机制执行过程及其应用

    Django信号机制是它框架中的核心部分,用于执行某些操作时触发某些事件。例如,在保存一个模型实例时,我们可以使用信号来在保存前或保存后执行某些操作。 Django信号机制的基本执行流程如下: 为信号定义一个接收器函数(或回调函数),该函数将在信号被发送时执行。 将接收器函数与信号关联。 当信号被发送时,所有与之关联的接收器函数都将被执行。 下面是一个简单的…

    Django 2023年3月13日
    00
  • Django 中的缓存问题

    Django 中的缓存问题 简单介绍 ​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. ​ 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. ​ 缓存是将一些常用的数据保存内存或者memcache中,在一定的…

    Django 2023年4月16日
    00
  • Django+Vue打造购物网站(七)

    个人中心功能开发 drf文档注释http://www.django-rest-framework.org/topics/documenting-your-api/ 动态设置serializer和permission获取用户信息 获取详情只需要添加一个mixins.RetrieveModelMixin,就行了 用户详情的序列化users/serializers…

    Django 2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部