整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

小白必看!Django 模板语言基础来啦

者 | 单雨

责编 | 胡巍巍

出品 | CSDN(ID:CSDNnews)

前言

为了实现模板封装和复用,提高HTML界面调试便捷性以及前后端解耦等目标,Django定义了自己的网络模板语言。

当前介绍模板语言的官方文档已经非常完备,几乎涵盖了开发中需要用到的知识点和需要注意的问题,但同时官方文档也存在一些问题:

  • 翻译不够完善,带来阅读的困难;

  • 一些知识点的介绍过于简短,存在大量的页内链接,阅读时需要跳转到不同的页面,阅读不连贯。

本文基于官方文档系统介绍了Django模板语言的基础知识点,方便快速了解Django模板语言。

模板系统设计哲学

Django的模板系统不是简单的把Python嵌入到HTML中。

它的设计宗旨是:模板系统旨在展示内容, 而不是程序逻辑,因此不在HTML页面中嵌入Python。

简单的说,模板只负责渲染数据,大多数逻辑应该交给视图(view)进行处理。

模板简介

模板是一个简单的文本文件。它可以生成任何基于文本的格式(如 HTML,XML,CSV等)。除了基本的HTML标签外,模板还包含两种额外的元素——变量和标签。

模板中包含的变量可以被替换为变量的值,标签则被替换为相应的模板控制逻辑。示例:

django

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}

<h1>{{ section.title }}</h1>

{% for story in story_list %}

<h2>

<a href="{{ story.get_absolute_url }}">

{{ story.headline|upper }}

</a>

</h2>

<p>{{ story.tease|truncatewords:"100" }}</p>

{% endfor %}

{% endblock %}

`{{ section.title }}`在模板渲染时将会被变量的值替换,for标签可以实现模板的循环渲染。

基础语法

变量

变量实现从模板上下文字典(返回HTTP响应时传递过来的字典)中输出一个值,这是一个类似于dict的对象,包含键值对。当模板引擎遇到一个变量时,它会计算该变量,并用结果替换它。

变量名由字母、数字字符和下划线("_")组成,但不能以下划线开头。点(".")也出现在变量中,代表属性调用,变量名中不能有空格或标点符号。

示例:

django

My first name is {{ first_name }}. My last name is {{ last_name }}.

当传入一个上下文字典`{'first_name': 'John', 'last_name': 'Doe'}`时,将会渲染得到:

django

My first name is John. My last name is Doe.

模板中的变量被字典中的值替换了。

变量还可以使用点表示法实现字典查找、属性查找和列表索引查找等操作:

django

{{ my_dict.key }}

{{ my_object.attribute }}

{{ my_list.0 }}

点表示法底层原理

当模板系统遇到一个点,它会按顺序尝试下面的动作:

1. 字典查询

2. 属性或方法查找

3. 数字索引查询

如果结果值是可调用的,则调用该值时将不带参数,调用的结果成为新的模板值。

当进行能覆盖字典查找的操作时,这种查找顺序可能会造成一些意想不到的行为。例如:如果试图循环一个collection .defaultdict字典对象:

django

{% for k, v in defaultdict.items %}

{其他操作}

{% endfor %}

因为字典查找是首先发生的,所以这个行为会先提供一个默认值,而不是使用预期的.items方法。在这种情况下,应该首先考虑使用字典查找,而不是使用字典的属性调用。

注意

属性通常被解释为一个文本字符串,防止和同名的变量冲突。例如{{foo.bar}}中的属性“bar”将被解释为一个文本字符串,如果模板上下文中存在变量“bar”,则不会使用该变量的值。

以下划线开头的变量属性可能不能访问,因为它们通常被认为是私有的。

如果引用不存在的变量,模板系统将插入string_if_invalid选项的值,该选项默认设置为“”(空字符串)。

标签

标签在模板渲染过程中提供任意逻辑。标签可以输出内容,作为控制结构,例如“if”语句或“for”循环,从数据库获取内容,甚至允许访问其他模板标签。

(1)标签声明

标签的一般形式为:

django

{% tag %}

示例:

django

{% csrf_token %}

(2)传入参数

django

{% cycle 'odd' 'even' %}

(3)成对使用的标签

有些标签需要开始和结束标签:

django

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

(4)常用标签

for:循环数组中的每个元素. 比如, 显示列表 `athlete_list` 中每个元素的 `name` 属性。

django

<ul>

{% for athlete in athlete_list %}

<li>{{ athlete.name }}</li>

{% endfor %}

</ul>

if 、elif和else:在上面,如果athlete_list不为空,则{{athlete_list|length}}变量将显示运动员的数量。

否则,如果athlete_in_locker_room_list不为空,则会显示“Athletes should be out…”消息。如果两个列表都为空,则显示“No athletes”。

也可以在if标签里使用过滤器和各种操作符:

django

{% if athlete_list|length > 1 %}

Team: {% for athlete in athlete_list %} ... {% endfor %}

{% else %}

Athlete: {{ athlete_list.0.name }}

{% endif %}

注意

虽然上面的示例可以工作,但是要注意,大多数模板过滤器都返回字符串,因此使用过滤器进行数学比较通常不会正常工作,而长度是个例外。

(5)更多

Django有很多内置标签,更多关于内置标签的信息请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags

如果需要编写自定义标签,请参考官方文档

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags

如果需要对使用的标签和自定义的标签做一份说明文档,可以使用Django提供的文档工具,详情请参考:

https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/

过滤器

简介

过滤器可以对变量做一些操作,例如给变量赋值,改变变量的值等。

修改变量显示

过滤器可以修改变量的显示。例如:

django

{{ name|lower }}

通过过滤器lower变量{{ name }}变为了小写字符,通过管道符(|)间隔变量和过滤器来使用过滤器。

链式调用过滤器

一个过滤器的输出可以作为下一个过滤器的输入。

{{ text|escape|linebreaks }}是一种常用的转换方式, 在这之后换行符被替换为了 <p> 标签。

转换变量和标签参数

过滤器转换变量和标签参数的值。示例:

django

{{ django|title }}

传入`{'django': 'the web framework for perfecalist With deadline '}`上下文字典时,该模板呈现为:

django

The Web Framework For Perfectionists With Deadlines

传入参数给过滤器

示例1:

django

{{ my_date|date:"Y-m-d" }}

my_date将会被替换为当前日期。

示例2:

django

{{ bio|truncatewords:30 }}

将会会显示 `bio` 变量的前30个字符

注意

过滤器参数中如果包含空格和标点符号,必须使用引号“”括起来,例如,要用逗号和空格连接列表,可以使用{{list|join:", "}}。

Django提供了大约60个内置模板过滤器,请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters

下面列举一些常用的过滤器:

default

如果变量为false或空,则使用给定的默认值。否则,使用变量的值。例如:

django

{{ value|default:"nothing" }}

如果 `value` 没有提供或者为空,那么将它显示为 "`nothing`" 。

length

返回值的长度。这对字符串和列表都适用。例如:

django

{{ value|length }}

如果 `value` 为 `['a', 'b', 'c', 'd']`, 那么他将被显示为 `4`。

filesizeformat

将值格式化为“人类可读的”文件大小(即“13kb”、“4.1 MB”、“102字节”等)。例如:

django

{{ value|filesizeformat }}

如果值为123456789,则输出为117.7 MB。

如果需要自定义过滤器,请参考请官方文档:

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/

注释

示例:

单行注释

django

{ this won't be rendered }

多行注释:{% comment %} 和{% endcomment %}

django

<p>Rendered text with {{ pub_date|date:"c" }}</p>

{% comment "Optional note" %}

<p>Commented out text with {{ create_date|date:"c" }}</p>

{% endcomment %}

注意:Comment标签不能嵌套使用。

作者简介:单雨,90后工科男,伪文艺青年。目前就读于北京理工大学宇航系,喜欢研究AI,网络爬虫,微信小程序以及机器人,痴迷于Coding,睡前必撸码。

【END】

jango 是 Python API 开发中最流行的框架之一,在这个教程中,我们来学习如何使用它。-- Rachel Waston(作者)


Django 所有 Web 框架中最全面的,也是最受欢迎的一个。自 2005 年以来,其流行度大幅上升。

Django 是由 Django 软件基金会维护,并且获得了社区的大力支持,在全球拥有超过 11,600 名成员。在 Stack Overflow 上,约有 191,000 个带 Django 标签的问题。Spotify、YouTube 和 Instagram 等都使用 Django 来构建应用程序和数据管理。

本文演示了一个简单的 API,通过它可以使用 HTTP 协议的 GET 方法来从服务器获取数据。

构建一个项目

首先,为你的 Django 应用程序创建一个目录结构,你可以在系统的任何位置创建:

$ mkdir myproject
$ cd myproject

然后,在项目目录中创建一个虚拟环境来隔离本地包依赖关系:

$ python3 -m venv env
$ source env/bin/activate

在 Windows 上,使用命令 env\Scripts\activate 来激活虚拟环境。

安装 Django 和 Django REST framework

然后,安装 Django 和 Django REST 模块:

$ pip3 install django
$ pip3 install djangorestframework

实例化一个新的 Django 项目

现在你的应用程序已经有了一个工作环境,你必须实例化一个新的 Django 项目。与 Flask 这样微框架不同的是,Django 有专门的命令来创建(注意第一条命令后的 . 字符)。

$ django-admin startproject tutorial .
$ cd tutorial
$ django-admin startapp quickstart

Django 使用数据库来管理后端,所以你应该在开始开发之前同步数据库,数据库可以通过 manage.py 脚本管理,它是在你运行 django-admin 命令时创建的。因为你现在在 tutorial 目录,所以使用 ../ 符号来运行脚本,它位于上一层目录:

$ python3 ../manage.py makemigrations
No changes detected
$ python4 ../manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

在 Django 中创建用户

创建一个名为 admin,示例密码为 password123 的初始用户:

$ python3 ../manage.py createsuperuser \
  --email admin@example.com \
  --username admin

在提示时创建密码。

在 Django 中实现序列化和视图

为了使 Django 能够将信息传递给 HTTP GET 请求,必须将信息对象转化为有效的响应数据。Django 为此实现了“序列化类” serializers。

在你的项目中,创建一个名为 quickstart/serializers.py 的新模块,使用它来定义一些序列化器,模块将用于数据展示:

from django.contrib.auth.models import User, Group
from rest_framework import serializers

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

Django 中的 视图 是一个接受 Web 请求并返回 Web 响应的函数。响应可以是 HTML、HTTP 重定向、HTTP 错误、JSON 或 XML 文档、图像或 TAR 文件,或者可以是从 Internet 获得的任何其他内容。要创建视图,打开 quickstart/views.py 并输入以下代码。该文件已经存在,并且其中包含一些示例文本,保留这些文本并将以下代码添加到文件中:

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):
    """
    API 允许查看或编辑用户
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer

class GroupViewSet(viewsets.ModelViewSet):
    """
    API 允许查看或编辑组
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

使用 Django 生成 URL

现在,你可以生成 URL 以便人们可以访问你刚起步的 API。在文本编辑器中打开 urls.py 并将默认示例代码替换为以下代码:

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# 使用自动路由 URL
# 还有登录 URL
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

调整你的 Django 项目设置

这个示例项目的设置模块存储在 tutorial/settings.py 中,因此在文本编辑器中将其打开,然后在 INSTALLED_APPS 列表的末尾添加 rest_framework:

INSTALLED_APPS = [
    ...
    'rest_framework',
]

测试 Django API

现在,你可以测试构建的 API。首先,从命令行启动内置服务器:

$ python3 manage.py runserver

你可以通过使用 curl 导航至 URL http://localhost:8000/users 来访问 API:

$ curl --get http://localhost:8000/users/?format=json
[{"url":"http://localhost:8000/users/1/?format=json","username":"admin","email":"admin@example.com","groups":[]}]

使用 Firefox 或你选择的 开源浏览器 :

一个简单的 Django API


有关使用 Django 和 Python 的 RESTful API 的更多深入知识,参考出色的 Django 文档 。

为什么要使用 Djago?

Django 的主要优点:

  1. Django 社区的规模正在不断扩大,因此即使你做一个复杂项目,也会有大量的指导资源。
  2. 默认包含模板、路由、表单、身份验证和管理工具等功能,你不必寻找外部工具,也不必担心第三方工具会引入兼容性问题。
  3. 用户、循环和条件的简单结构使你可以专注于编写代码。
  4. 这是一个成熟且经过优化的框架,它非常快速且可靠。

Django 的主要缺点:

  1. Django 很复杂!从开发人员视角的角度来看,它可能比简单的框架更难学。
  2. Django 有一个很大的生态系统。一旦你熟悉它,这会很棒,但是当你深入学习时,它可能会令人感到无所适从。

对你的应用程序或 API 来说,Django 是绝佳选择。下载并熟悉它,开始开发一个迷人的项目!


via: https://opensource.com/article/19/11/python-web-api-django

作者: Rachel Waston 选题: lujun9972 译者: MjSeven 校对: wxy

本文由 LCTT 原创编译, Linux中国 荣誉推出

点击“了解更多”可访问文内链接

者:HelloGitHub-追梦人物

我们已经成功地开发了一个功能比较完备的个人博客,是时候来总结一下我们的工作了。博客系列完整的源代码地址:

https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial

  • 在教程的前两篇,我们介绍了如何搭建 django 开发环境,如何创建 django 项目以及 django 应用,这是我们进行 django 项目开发的基础。
  • 第 3、4 篇:讲了 django ORM 的基础操作。ORM 是 django 核心中的核心,不仅 django 自带的应用底层全都依赖于 ORM,大部分使用 django 构建的应用基本也离不开 django ORM 的操作,所以能否熟练掌握 django 的 ORM API 决定了能否写出高质量、高性能的 django 应用。
  • 第 5、6 篇:讲解了 django 基本的视图函数,视图函数的作用是接收一个 HTTP 请求,根据这个请求的意图返回相应的 HTTP 响应。在这个请求处理的过程中,通常都会涉及到使用 ORM 进行数据库的增删改查操作。
  • 第 7 篇:介绍了 django 的杀手锏应用,开箱即用的 Admin 管理台。我们可以通过这个管理台直接对数据库中的数据进行增删改查操作。
  • 第 9、10 篇:介绍了 Markdown 的使用,对于博客、技术论坛之类的应用,使用 Markdown 来撰写内容是一个常见的需求。
  • 第 12、13 篇:介绍了如何自定义模板标签并使用它们。模板标签用于 django 的模板系统中,用来生成 HTML 页面。django 的模板系统自带了大量的模板标签。但如果自带的标签不满足需求,我们就可以拓展 django 模板系统的 API 来自定义模板标签。
  • 第 14 篇:我们利用上述学习到的知识开发了一个独立的 django 评论应用。这里面我们还初步接触了表单的使用。django 的表单是对 HTML 表单的封装,它在后台完成数据校验、清理等功能,并对非法的表单输入返回给客户端友好的错误提示。
  • 第 16、17、18、19:向大家介绍了运维方面的知识,包括如何在服务器上部署 django 应用,如何编写自动化脚本来全自动部署,如何给网站开启 HTTPS 以提高安全性。特别是使用 Docker 进行部署后,我们把整个 django 部署的过程缩减到只需线上执行几条命令就能完成,Docker 帮助我们极大简化了部署流程。
  • 第 21 篇:我们介绍了基于类的视图和通用类视图。之前说了,django 的视图本质上是一个函数,它接收一个 HTTP 请求,返回一个 HTTP 响应。类视图虽然是一个类,但这只是针对开发者而言,django 通过 Python 魔法将类转化为一个可被调用的函数。使用类的好处是,它允许被继承,因此在某些情况下可以提高代码的复用性。
  • 第 22 篇:演示了如何在 Python 脚本里面独立地使用 django 的 ORM。一般要使用 django 的 ORM 必须启动整个 django 项目,而如果要在独立的脚本中使用的话,就必须进行一些额外的设置。
  • 第 23 篇:我们介绍了如何使用 django 第三方库,django 的强大不仅在于它自身功能的完备程度,更在于其繁荣的社区。大量开发者在开源平台发布了很多优质的 django 拓展应用,涵盖了 web 开发的方方面面。这里我们只介绍了一个分页应用,更多应用大家可以在 GitHub 通过搜索关键词 django 进行探索。
  • 第 27、28 篇:我们介绍了搜索功能的实现。一开始使用的是比较简单的搜索方式,利用之前所学的 django 知识就能完成。不过为了更好的搜索体验,我们进一步引入了 elasticsearch 这个专业的搜索服务来提供搜索功能,同时使用了一个 django 第三方库 django-haystack 来将 elasticsearch 和 django 无缝对接。同时可以看到,有了 Docker 容器技术,引入一个外部服务变得非常简单。
  • 第 29、30、31 篇:我们对博客补充了完善的单元测试,测试过程中我们发现了一些隐藏的 bug 并进行了修复,由此测试的重要性可见一斑。此外,为了衡量测试的质量,我们使用 coverage.py 对代码测试覆盖率进行了统计,越高的测试覆盖率说明测试越充分,程序出现 bug 的几率也就越小。

现在,我们已经有了一个功能比较完备的个人博客应用。而且,在测试的保障护航下,我们可以在不破坏现用功能的情况下,轻松加入新的功能。

教程进行到这里,HelloDjango 博客教程就要准备告一段落了,大部分 web 开发中的需求,你都可以通过教程中讲到的知识点,结合 django 的官方文档来实现。

不过,真的要结束了吗?我的回答是没有也不想结束!

Django 中还有很多值得介绍的地方,就拿博客来说,我们还可以做这些很酷的功能:

  • 支持用户登录,甚至使用 GitHub、新浪微博等第三方应用登录
  • 支持多级评论
  • 国际化
  • 使用缓存进行性能优化
  • 支持邮件订阅,有新的博客就发送邮件提醒订阅者

等等,这些对于其他 Web 系统来说,基本也都是必不可少的。

所以,HelloDjango 博客项目会继续以这样的形式继续下去:

围绕着某一个功能进行开发,功能开发完成之后附带输出一篇详细介绍功能实现原理和过程的教程。我希望 HelloDjango 博客项目不仅仅是一个教学演示项目,也不仅仅是一个高质量、功能完备的 django 第三方博客应用,而是两者都是!

号外

此外,虽然 HelloDjango 博客项目教程定期更新已经结束,但接下来我会开始以定期更新的方式向大家介绍如何 django-restframework + Vue 或者 React 这种更加现代化的前后端分离开发方式,大量公司都采用这种开发方式,如果你以找工作为目的而学习 django 的话,怎么能不学习这种开发模式呢?

HelloDjango-blogs 的教程暂时告一段落,全新的 HelloDjango-django-restframework 系列教程就要要重新扬帆起航了,大家敬请期待!

『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎联系我、加入我们,让更多人爱上开源、贡献开源~