Django_模板(四)

news2024/11/18 6:36:25

目录

一、模板

创建模板文件

定义模板

视图调用模板

简写视图调用的模板

二、去除模板中的硬编码 URL

三、为 URL 名称添加命名空间

 四、生成模板渲染后的静态文件

源码等资料获取方法


一、模板

如何向请求者返回一个漂亮的页面呢?

肯定需要用到html、css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义就太麻烦了吧,因为定义字符串是不会出任何效果和错误的,如果有一个专门定义前端页面的地方就好了。

解决问题的技术来了:模板

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

创建模板文件

在项目test1中新增templates目录,现在我们可以直接将模板放入 test1/templates,但实际上并不建议这样做。Django会选择找到的第一个名称匹配的模板,如果在其他应用有一个具有相同名称的模板,Django则无法区分它们。我们需要Django能够指向正确的位置,而确保这一点的最佳方法是将这些模板放在应用程序本身命名的另一个目录中。目录结构如下图:

 

设置模板的查找路径:打开test1/settings.py文件,设置TEMPLATES的DIRS值

'DIRS': [os.path.join(BASE_DIR, 'templates')],

完整配置如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(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',
            ],
        },
    },
]

定义模板

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

{{变量名}}

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

{%代码段%}

打开templtes/booktest/index.html文件,定义模板如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书列表</title>
    <style>
        td {text-align: center;}
    </style>
</head>
<body>
<h1>{{title}}</h1>
<table width="500px">
    <tr>
        <th>书籍名称</th>
        <th>发布日期</th>
    </tr>
{%for book in books%}
    <tr>
        <td>{{book.btitle}}</td>
        <td>{{book.bpub_date}}</td>
    </tr>
{%endfor%}

</table>
</body>
</html>

视图调用模板

调用模板分为三步骤:

  • 1.找到模板
  • 2.定义上下文
  • 3.渲染模板

打开booktst/views.py文件,调用上面定义的模板文件

from django.shortcuts import render
from booktest.models import BookInfo
from django.http import HttpResponse
from django.template import loader, RequestContext

# Create your views here.


def index(request):
    # 1.获取模板
    template=loader.get_template('booktest/index.html')
    # 2.定义上下文
    books = BookInfo.objects.all()
    # context=RequestContext(request,{'title':'图书列表','books':books})    # 老版本
    context = {'title': '图书列表', 'books': books}
    # 3.渲染模板
    # return HttpResponse(template.render(context))     # 老版本
    return HttpResponse(template.render(context, request))

打开浏览器刷新页面,显示效果如下图:

简写视图调用的模板

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

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

打开booktst/views.py文件,调用render的代码如下:

from django.shortcuts import render
from booktest.models import BookInfo

# Create your views here.


def index(request):
    books = BookInfo.objects.all()
    context = {'title': '图书列表', 'books': books}
    return render(request, 'booktest/index.html', context)  # 返回HttpResponse实例

二、去除模板中的硬编码 URL

在案例中的 test1/templates/booktest/index.html 文件里编写的链接都硬编码的链接,比如:

<a href="/booktest/search/{{book.id}}">查看英雄</a>

如果要将路径修改为searchHeroInfo,需要同时修改模板和路由才行。在一个包含很多应用的项目中,使用硬编码和强耦合的链接,修改起来是十分困难的。

我们可以将 booktest/urls.py 的路由改成如下代码:

...
# ex: /booktest/search/1
path('search/<int:bid>', views.hero_info, name='search') 
...
  • <int:bid> 表示正则方式匹配对应路径输入值,并将匹配结果转换成Int传给视图的第二个形参
  • name 为路由反向代理的名称

然后,在 test1/templates/booktest/index.html 文件中使用  {% url 反向代理名称 %} 替换硬编码部分:

<a href="{% url 'search' book.id %}">查看英雄</a>

修改完后,如果要改变投票详情视图的 URL,比如改成 booktest/searchHeroInfo/1,那么就不用再修改模板中的任何代码(包括其它模板),只要在 booktest/urls.py 里修改一下就行:

# ex: /booktest/search/1
path('searchHeroInfo/<int:bid>', views.hero_info, name='search')

三、为 URL 名称添加命名空间

 在一个真实的 Django 项目中,可能会有五个,十个,二十个,甚至更多应用。Django 如何分辨重名的 URL 呢?举个例子,booktest 应用有 search 视图,可能另一个应用也有同名的视图。Django 如何知道 {% url %} 标签到底对应哪一个应用的 URL 呢?

答案是:在根 URLconf 中添加命名空间。在 booktest/urls.py 文件中稍作修改,加上 app_name 设置命名空间:

from django.urls import path

from booktest import views

app_name = 'booktest'
urlpatterns = [
    # ex: /booktest/    # 调用index视图函数
    path('', views.index, name='index'),

    # ex: /booktest/create  # 调用create视图函数
    path('create', views.create),

    # ex: /booktest/delete/1
    # re_path('delete/(\d+)', views.delete),   # 在path中使用正则时需要导入re_path方法
    path('delete/<int:bid>', views.delete, name='delete'),     # bid为视图函数的的形参名

    # ex: /booktest/search/1
    path('searchHeroInfo/<int:bid>', views.hero_info, name='search')
]

现在,编辑 test1/templates/booktest/index.html 文件,从:

<a href="{% url 'search' book.id %}">查看英雄</a>

修改为指向具有命名空间的详细视图:

<a href="{% url 'booktest:search' book.id %}">查看英雄</a>

 在视图函数中重定向时使用具有命名空间的视图,编辑 test1/booktest/views.py 文件,从:

def create(request):
    book = BookInfo(btitle="流星蝴蝶剑", bpub_date=datetime.date(1995, 12, 30), bread=2, bcomment=1)
    book.save()
    return redirect("/booktest/")

修改为:

def create(request):
    book = BookInfo(btitle="流星蝴蝶剑", bpub_date=datetime.date(1995, 12, 30), bread=2, bcomment=1)
    book.save()
    return redirect(reverse("booktest:index"))

若重定向的界面需要传个book.id参数,代码如下:

def create(request):
    ...
    return redirect(reverse('booktest:index', args=(book.id,)))

 四、生成模板渲染后的静态文件

render函数返回的是一个 HttpResponse 实例对象,要生成模板渲染后的静态文件,可按如下方式生成。

 # 上下文
    content = {
        "good_types": good_types,
        "good_banners": good_banners,
        "promotion_banners": promotion_banners,
    }
    # 使用模板
    # 1.加载模板文件,返回模板对象
    temp = loader.get_template('index.html')
    # 2.模板渲染
    static_index_html = temp.render(content)

    # 生成首页对应静态文件
    save_path = os.path.join(settings.BASE_DIR, 'static/static_index.html')
    with open(save_path, 'w', encoding="utf-8") as f:
        f.write(static_index_html)

执行代码后,会在对应路径生成静态文件,静态文件中django自带的模板语法会被全部渲染成html文件


源码等资料获取方法

各位想获取源码的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

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

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

相关文章

多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语…

Unity3d的智力拼图小游戏

Unity3d的智力拼图小游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88015674

关于async/await

async/await是什么&#xff1f; 简单来说async/await是Promise的语法糖&#xff0c;async是异步的意思&#xff0c;await是等待的意思。async function 声明一个函数里面可能有异步代码需要执行&#xff0c;await则可以认为是等待一个异步方法执行完成。 async/await的用法 …

创建台虚拟机并安装上window10系统(NETBASE 第一课)

虚拟机&#xff08;Virtual Machine&#xff09;是一种基于软件的模拟技术&#xff0c;它可以将一台物理计算机模拟成多个虚拟计算机运行不同的操作系统和应用程序&#xff0c;从而实现资源的虚拟化和隔离。在虚拟机中&#xff0c;每个虚拟计算机都拥有自己的独立的操作系统和应…

MySQL基础篇第1章(数据库概述)

文章目录 1、为什么要使用数据库2、数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库管理系统排名2.4 常见的数据库介绍 3、MySQL介绍3.1 概述3.2 MySQL发展史重大事件3.3 关于MySQL 8.03.4 Oracle VS MySQL 4、RDBMS 与 非RDBMS4…

java的void和Void

java 函数如果什么类型的值也不需要返回&#xff0c;用关键字void。 而Void是一个类&#xff0c;是一个不能实例化的占位符类&#xff0c;它持有对一个类对象的引用&#xff0c;这个类对象代表java关键字void。 如果函数返回值是Void&#xff0c;那么函数必须明确返回null。 J…

将 jar 构建成 docker 镜像实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Java的数据结构

目录 数据结构: 1,数组 2,链表 3,哈希表 4,队列 5,堆 6,栈 7,树 8,图 数据结构: 1,数组 优点: 查找元素的速度很快; 按照索引来遍历数组的速度也很快。 缺点: 数组大小无法改变,一旦创建就无法扩容; 数组只能存储一种数据类型的数据; 插入、修改、删除时比较麻烦&…

1-软件测试答疑

目录 1.什么是软件测试&#xff1f; 1.1.生活中测试场景 1.2.软件测试定义 1.3.为什么要有软件测试&#xff1f;/重要性 1.4.练习&#xff1a;软件系统登录功能如何测试&#xff1f; 1.5.软件测试的特点 2.软件测试和开发的区别 2.1.工作内容 2.2.技能要求 2.3.难易程…

spring监视器actuator

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…

第五章 神经网络与手写体识别

文章目录 第五章 神经网络5.1神经元模型5.2感知机与多层网络5.3误差逆传播算法5.4全局最小和局部最小5.5其他常见神经网络5.5.1RBF网络5.5.2ART网络5.5.3SOM网络5.5.4级联相关网络5.5.5Elman网络5.5.6Boltzmann机 5.6深度学习5.7实验&#xff1a;手写数字识别 第五章 神经网络 …

【QT】——QJson类的使用

目录 1.Json的格式 1.1.Json数组 1.2.Json对象 2.QJson 2.1 QJsonObject 2.2 QJsonValue 2.3 QJsonArray 2.4 QJsonDocument 3.示例 3.1 写操作 3.2 读操作 1.Json的格式 Json的基本概念 Json 是一种数据格式&#xff0c;和语言无关&#xff0c;在什么语言中都可以…

Host is not allowed to connect to this MySQL server

问题:win10 系统上运行node&#xff0c;运行提示&#xff1a;Host is not allowed to connect to this MySQL server。 在windows10上面装完MySQL8.0.28&#xff0c;发现本地可以使用Navicat进行连接 &#xff0c;但是在vue项目中调用node接口连接mysql却报错Host is not all…

Python学习笔记(十五)————文件操作相关

目录 1&#xff09;文件编码 2&#xff09; 文件的读取 ①open()打开函数 ② mode常用的三种基础访问模式 ③读操作相关方法 read()方法&#xff1a; readlines()方法&#xff1a; readline()方法&#xff1a;一次读取一行内容 for循环读取文件行 close() 关闭文件对象 wi…

simulink 结构体 bus creator

目录 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Concatenate 结构体数据存文件 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Co…

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

分析慢SQL的步骤 慢查询的开启并捕获&#xff1a;开启慢查询日志&#xff0c;设置阈值&#xff0c;比如超过5秒钟的就是慢SQL&#xff0c;至少跑1天&#xff0c;看看生产的慢SQL情况&#xff0c;并将它抓取出来explain 慢SQL分析show Profile。&#xff08;比explain还要详细…

手搭手入门Spring boot+Mybatis+达梦数据库(国产数据库)

环境介绍 软件版本DM数据库dm8_20230418_x86_win_64IDEAIntelliJ IDEA 2022.2.1JDK1.8Spring Boot2.7.13mybatis2.3.1 达梦&#xff08;国产数据库&#xff09;可以将数据库名和表名自动转换为大写(注意&#xff01;&#xff01;创建达梦数据库实例的时候配置是否有勾选大小写…

Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin

Android Glide自定义AppGlideModule&#xff0c;让Glide在app启动后基于定制化GlideModule加载&#xff0c;kotlin project的build.gradle: buildscript {repositories {maven {url uri("https://plugins.gradle.org/m2/")}}dependencies {classpath("org.jet…

Maven高级(二)--继承与版本锁定

一.继承 1.目的&#xff1a;不同模块中经常需要用到同一个依赖&#xff0c;这样要在每个pom.xml中都引入对应的坐标&#xff0c;继承可以用来解决依赖引入重复的问题。 2.实现&#xff1a;我们可以在创建一个父工程&#xff0c;然后将多个模块来继承这个父工程。然后再将各个模…

功能需求-前端在合同页面显示图片印章

需求描述 需要在项目中的合同页面的指定位置显示一个配置好的图片印章&#xff0c;实现好的效果&#xff0c;如下&#xff1a; 实现方案 使用使用CSS的绝对定位position来实现&#xff0c;代码如下&#xff1a; <div id"FatherBuyer"><img :src"s…