前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django教程 —— Django模板

Django教程 —— Django模板

作者头像
忆想不到的晖
发布于 2021-09-29 08:14:40
发布于 2021-09-29 08:14:40
1.6K00
代码可运行
举报
文章被收录于专栏:huihui
运行总次数:0
代码可运行

引言

如何向请求者返回一个漂亮的页面呢? 肯定需要用到 html、css ,如果想要更炫的效果还要加入 js,问题来了,这么一堆字符串全都写到视图中,作为 HttpResponse() 的参数吗?

先看看如何拼接 html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
"""
@Author   :Hui
@Desc     :{book应用视图模块}
"""
from django.views import View
from django.http import HttpResponse


# /book/index
def index(request):
    """图书首页"""
    if request.method == "GET":
        res_html = "<h1>GET请求 - 图书信息页</h1><br/>"
        books = ["射雕英雄传", "神雕侠侣", "倚天屠龙记"]

        res_html += "<ul>"

        for book in books:
            res_html += "<li>"
            res_html += book
            res_html += "</li>"

        res_html += "</ul>"

        return HttpResponse(res_html)

这样定义就太麻烦了吧,并且定义字符串是不会出任何效果和错误,如果有一个专门定义前端页面的地方就好了。

Django 中,将前端的内容定义在 模板 中,然后再把模板交给视图调用,各种漂亮、炫酷的效果就出现了。

运行环境

  • Python 3.9
  • Django 3.1.2

Django模板

创建模板

Django项目下创建 templates 目录然后在创建 book 目录,代表这存放着 book 应用的模板文件。

目录结构如下图:

配置模板

Django 项目下的 setting.py 文件中找到 TEMPLATES 配置选项,配置如下目录路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'DIRS': [BASE_DIR / 'templates']
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],   # 配置模板目录
        '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',
            ],
        },
    },
]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BASE_DIR = Path(__file__).resolve().parent.parent

BASE_DIR 是你 Django 项目的绝对路径

可以在终端控制台输入如下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python manage.py shell

打开项目的 shell 终端进行调试。

定义模板

打开 templtes/book/index.html 文件,定义代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="zh-hans">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图书信息</title>
</head>
<body>
    <h2>{{ title }}</h2>
    <ul>
        {% for book in books %}
            <li>{{ book.title }} --- {{ book.author }}</li>
        {% endfor %}
    </ul>
</body>
</html>

在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{{ 变量名 }}

在模板中编写代码段语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% 代码段 %}

更多模板语法这里就不一一叙述了。

视图调用模板

调用模板分为三步骤:

  • 找到模板
  • 定义上下文
  • 渲染模板
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.views import View
from book.models import BookInfo
from django.template import loader
from django.http import HttpResponse


# /book/info
class InfoView(View):
    """图书信息视图类"""

    def get(self, request):
        # 从数据库中获取图书信息
        books = BookInfo.objects.all()

        # 获取模板
        tmp = loader.get_template('book/index.html')

        # 定义上下文
        context = {
            "title": "图书信息",
            "books": books,
        }
            
        # 渲染模板
        content = tmp.render(context)

        return HttpResponse(content)

在浏览器上访问 http://127.0.0.1:8000/book/info 效果如下图

视图调用模板简写

视图调用模板都要执行以上三部分,于是 Django 提供了一个函数 render 封装了以上代码。

函数 render 包含3个参数:

  • 第一个参数为 request 对象
  • 第二个参数为 模板文件路径
  • 第三个参数为 字典,表示向模板中传递的 上下文数据

调用 render 的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.views import View
from book.models import BookInfo
from django.shortcuts import render


# /book/info
class InfoView(View):
    """图书信息视图类"""

    def get(self, request):
        # 从数据库中获取图书信息
        books = BookInfo.objects.all()

        # 定义上下文
        context = {
            "title": "图书信息",
            "books": books,
        }

        return render(request, "book/index.html", context)

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Discourse 安装 Google Adsense
对 Discourse 的广告服务来说还是可以的,因为广告服务的位置不是非常影响阅读。
HoneyMoose
2020/12/28
9910
Discourse 安装 Google Adsense
一款精美小巧的开源社区论坛系统:Homeland安装教程
说明:最近看到个论坛Homeland,一款基于Rails的开源、免费、不限制商业使用的社区/论坛系统,很轻巧,整体布局页不错,功能也很强大的,支持将文件存储在本地、UpYun、Aliyun OSS,用户可以在自己的文章中上传微信/支付宝收款码,官方也给出了Docker安装方法,搭建起来自然就变的很简单了,这里就发下。
子润先生
2021/05/29
2K0
如何运用docker配合python开发
由于开发一个python程序时需要依赖大量的三方库包,且python2和3本身就有互不兼容的地方,我们往往需要一个隔离的环境,来避免版本影响造成的bug。 传统的做法大多数人可能会选择virtualenv来隔离,但是它有很多明显的缺点: - 无法提供完全的隔离 - 如果不想在正式环境中使用,它就会造成差异
py3study
2020/01/07
6430
如何运用docker配合python开发
Discourse 云平台安装
本文档是根据 discourse/INSTALL-cloud.md at main · discourse/discourse · GitHub 页面中的内容进行翻译的。
HoneyMoose
2021/08/01
1.3K0
Discourse 云平台安装
在Docker上安装Discourse论坛系统
DiscourseStack Overflow的联合创始人 Jeff Atwood 推出的一个新的开源论坛项目,其目的是为了改变十年未变的论坛软件。它摒弃了传统论坛的话题讨论形式、拥有自学习系统、全Web应用同时适用于桌面和移动终端。 在本教程中,我们将使用Docker(一个容器化应用程序)在一个隔离的环境中安装Discourse。
宇cccc
2018/07/25
3.6K0
discourse安装plugin方法
最近需要安装discourse-assign和tickets-plugin两个插件到discourse上。记录一下安装步骤
姚华
2023/02/22
7580
使用腾讯云轻量应用服务器搭建轻论坛 Discourse
Discourse 是一款很不错的轻论坛程序。与腾讯云轻量应用服务器一样,他们都属于轻占用但高效的项目。另外PWA等功能,在这款论坛程序上已经内置,也无需安装其他无用插件。相比 NodeBB 或 Flarum 等其他论坛程序,Discourse 基于 Ruby 开发并使用 PostgreSQL 和 Redis 数据库。下面让我们开始教程:
Nyarime
2021/12/14
10.4K0
使用腾讯云轻量应用服务器搭建轻论坛 Discourse
Discourse 搭建
Discourse 是由 Stack Overflow 创始人之一的 Jeff Atwood 主导的开源论坛项目,使用时能感受到和 Stack Overflow 的关联性,比如为鼓励有效的技术讨论、控制人身攻击等做了很多努力,页面的布局方式也有相似之处。Discourse 提供了非常丰富的配置方式,也支持插件扩展,是值得学习的论坛类开源项目。
用户2443625
2018/09/26
2K0
discourse论坛搭建教程
官方网址:Discourse is the place to build civilized communities | Discourse – Civilized Discussion
夜梦星尘
2024/08/20
6690
discourse论坛搭建教程
Discourse PostgreSQL 15 升级
Discourse 的官方已经完成了对 Discourse 容器的修改,当 Discourse 的管理员对容器进行重构的话,最新的 Discourse 版本将会自动升级数据库到 PostgreSQL 15。虽然这次升级是从 PostgreSQL 13 到 PostgreSQL 15,如果再 2020 年的时候,你的 Discourse 按照实例没有升级到 PostgreSQL 13(PostgreSQL 13 update - Announcements - Discourse Meta ),你可以跳过这个升级过程,直接升级到 PostgreSQL 15。
HoneyMoose
2025/02/10
530
搭建邮件服务器和论坛
今天一起来看看如何搭建自己的邮件服务器和论坛服务,使用的工具分别为 Ewomail 和 Discourse。
周萝卜
2019/08/23
6.1K0
微信公众号文章RSS订阅
本文将介绍如何使用 Wewe-RSS 服务将微信公众号文章转换为 RSS 订阅链接,方便您更高效地阅读感兴趣的公众号内容。
renhai
2024/05/17
1.6K0
微信公众号文章RSS订阅
用全站 CDN 部署 Discourse 论坛
Discourse 是一款由 Stack Overflow 的联合创始人——Jeff Atwood,基于 Ruby on Rails 开发的开源论坛。相较于传统论坛,Discourse 从他全面开放的开源态度、简介明了的页面风格到其特有的内容运作体系都在证明自己是一款为下一个 10 年的互联网而设计的产品。现在,诸如 Car Talk 等国外知名产品都采用 Discourse 为论坛方案。
NebulaGraph
2020/04/08
4K0
用全站 CDN 部署 Discourse 论坛
使用 Docker 部署 MediaWiki
MediaWiki 是 Wikipedia 使用的网站解决方案的开源版,以个人观点来看,Wiki 在这个时代显得不够时尚,且不支持 MarkDown 等新兴的标记语言,另外页面的组织方式采用了自己的一套管理语言,上手需要一定的学习成本。不过经典总归是经典。
用户2443625
2018/08/23
2.4K2
使用 Docker 部署 MediaWiki
微信公众号文章RSS订阅
本文将介绍如何使用 Wewe-RSS 服务将微信公众号文章转换为 RSS 订阅链接,方便您更高效地阅读感兴趣的公众号内容。
renhai
2024/05/27
1.1K0
微信公众号文章RSS订阅
在 Ubuntu 上安装 Discourse 开发环境
本指南只针对 Discourse 开发环境的配置,如果你需要在生产环境中安装 Discourse ,请访问页面:Install Discourse in production with the official, supported instructions - sysadmin - Discourse Meta 中的内容。
HoneyMoose
2022/12/10
2.6K0
在 Ubuntu 上安装 Discourse 开发环境
2.Ubuntu安装docker
解释一下命令的意思: sudo:_当前命令我希望用root用户执行_ wget:_是命令行的一个下载工具_ -qO-:_让wget标准输出_ | sh :_交给shell去执行_ 总的连起来:_以root用户身份用wget下载工具下载一个shell脚本文件标准输出交给sh执行_
友儿
2022/09/11
8580
Discourse 如何使用命令行方式进行恢复
本文主要用于说明如何从命令行工具的方式中恢复 Discourse,以及我们在备份和恢复的过程中遇到的坑和解决办法。
HoneyMoose
2020/10/06
1.4K0
Discourse 如何使用命令行方式进行恢复
Discourse 如何不使用 Let’s Encrypt 而使用 CA 签名的密钥进行安装
通过访问密钥签发机构上面提供的信息了解到:Let’s Encrypt 针对一个域名只会在一定时间内签发 5 次,如果你超过了签发的次数,你需要 5 天后才能再次申请。
HoneyMoose
2020/10/05
1.3K0
Discourse 如何不使用 Let’s Encrypt 而使用 CA 签名的密钥进行安装
如何在Ubuntu 14.04上使用Docker和Docker Compose配置持续集成测试环境
持续集成(CI)指的是开发人员尽可能频繁地集成代码,并且在自动化构建将每个提交合并到共享存储库之前和之后都要进行测试的实践。
水门
2018/09/25
2K0
相关推荐
Discourse 安装 Google Adsense
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档