Django的模板系统

一、模板的组成

html代码和逻辑控制代码

二、逻辑控制代码的形式


1、变量(使用双大括号引用变量)

a、template和context

语法 :  {{ var_name }}

模板系统不仅可以传字符串,它可以传递任意对象,对于向列表、字典、元组等对象,我们可以用句点来处理,叫做深度变量的查找

eg

对应views.py

def index(request):l = [1, 2, 3]return render(request, 'index.html', locals())

 对应index.html

<body>
<h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1>
</body>

浏览器返回

传递过来的列表的第一个元素是 1

b、变量的过滤器filter

语法格式 : {{ 对象|filter:参数}}

过滤器中有add、addslashes、capfirst、cut、date、default、default_if_none等

add:给变量加上相应的值

addslashes:给变量中的引号前加斜线

capfirst:首字母大写

cut:去除指定字符

date:格式化时间

。。。

如果传入的变量是一段标签,并想要实现其功能,则应给使用safe函数

eg:

不用safe函数

<body>
<h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1>
这是一个{{ s }}
</body> 

浏览器输出

这是一个<a href='#'>跳转链接</a> 

使用safe函数

<body>
<h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1>
这是一个{{ s|safe }}
</body>

浏览器输出

这是一个跳转链接

autoescape也可以实现同样的功能

eg

<body>
<h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1>
这是一个{{ s|safe }}<br>
{% autoescape off %}这是一个{{ s }}
{% endautoescape %}
</body>

  2、标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

语法:{% tag %}

a、{% if %}的使用,做判断,有if就要有{% endif %}

eg:

{% if l.0 > 3 %}<h2>{{ l.0 }}{% else %}<h2>{{ l.2 }}
{% endif %}
</h2> 

b、{% for %}的使用,做遍历,同样有for就要有{% endfor %}

eg:

{% for num in l %}<p>{{ num }}</p>
{% endfor %} 

for循环中还内置了forloop模板变量,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1,forloop.counter0,从0开始计数,forloop.revcounter反转计数,forloop.first第一次循环时其值为True

eg:

{% for num in l %}<p>{{ forloop.counter0 }}:{{ num }}</p><p>{{ forloop.counter }}:{{ num }}</p>
{% endfor %}

c、{%csrf_token%}:csrf_token标签

当用post的方法提交表单时,django会报一个错误,这是django一个保护机制,用来防止跨站攻击

eg:

<form action="/blog/register/" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">
</form>

报错信息

Forbidden (403)

CSRF verification failed. Request aborted.

You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.

If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for 'same-origin' requests.

添加后顺利提交

<form action="/blog/register/" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %}
</form>

 d、{% url %} 引用路由配置的地址

eg:

<form action="{% url 'reg' %}" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %}
</form>

req为路由配置中的别名 

e、{% verbatim %}: 禁止render,有开始就有结束{% endverbatim %}

包含在其中的代码将不被render渲染

f、{% load %}: 加载标签库

g、{% with %}:用更简单的变量名替代复杂的变量名,需要{% endwith %}

eg:

{% with s=qwer %}{{ s }}
{% endwith %}

注意:s=qwer之间不得有空格,否则报错


 3、自定义filter和simple_tag

a、在app中创建templatetags模块(必须的)

b、创建任意 .py 文件,如:mytag.py

eg:

自定义

from django import template
from django.utils.safestring import mark_saferegister = template.Library()#变量名必须时register@register.filter
def filter_mul(a, b):return a*b@register.simple_tag()
def tag_mul(a, b):return a*b

如何使用

在html文件的第一行加载{% load mytag %}即可,这里创建的文件为mytag.py

eg:

{% load mytag %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>BBU</title>
</head>

 

需要注意的是   filter可以用在if等语句后,simple_tag不可以


三、模板的继承

1、如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

2、一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好

3、如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了

4、不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容

eg:

a、创建base.html模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% block base1 %}
<p>我是模板</p>
{% endblock %}
<form action="{% url 'reg' %}" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %}
</form>
</body>
</html>

b、创建子模板register.html,并利用{{ block.super }}输出父模板中代码块中的内容

{% extends 'base.html' %} #继承自base.html{% block base1 %}<p>{{ s }}</p>  #s为后端传入的变量{{ block.super }}
{% endblock %}

 

访问register.html

转载于:https://www.cnblogs.com/sumcet/p/8996723.html

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

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

相关文章

Java SE 7 Update 25 –发行说明进行了解释。

昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是与所有其他Oracle产品一起不符合Oracle关键补丁更新计划的最后一个更新。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布周期。 但…

springmvc mybatis 做分页sql 语句

<?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"ssmy.dao.UserDao"> <res…

LeetCode Subarray Product Less Than K

原题链接在这里&#xff1a;https://leetcode.com/problems/subarray-product-less-than-k/description/ 题目&#xff1a; Your are given an array of positive integers nums. Count and print the number of (contiguous) subarrays where the product of all the elements…

Ansible: hosts文件拆分为inventory和定义inventory全局变量

前言 随着管理机器的增多&#xff0c;我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题&#xff0c;极其不便于管理&#xff0c;而将hosts文件拆分为inventory就可解决该问题&#xff1b;另外&#xff0c;hosts中的每个主机条目需要指定用户名和私钥或密码&#xff0…

gulp实用配置(1)——demo

在React和Vue推进下&#xff0c;现在很多人都在使用webpack作为自动化构建工具&#xff0c;但其实在很多时候我们并不是一定需要用到它&#xff0c;gulp这样的轻量级构建工具就足够了。 最近一段时间不是太忙&#xff0c;所以就写了三份配置&#xff0c;用在不同的情况下。 这…

使用Maven运行Solr

使用Maven运行Solr Solr是一个开放源代码搜索服务器&#xff0c;它是使用Lucene Core的索引和搜索功能构建的&#xff0c;它可以用于使用几乎任何编程语言来实现可扩展的搜索引擎。 尽管Solr具有许多优点&#xff0c;但建立一个开发环境并不是其中之一。 该博客文章描述了如何…

oracle11g日志原理,oracle11gRAC之log日志体系

oracle11gRAC之log日志体系&#xff1a;1、CRS日志(grid)&#xff1a;首选查看alertlog&#xff1a;$CRS_HOME/grid/log/hostname/alertdbserver1.logClusterware后台进程日志&#xff1a;crsd.Log: $ORA_CRS_HOME/grid/log/hostname/crsd/crsd.Logocssd.Log: $ORA_CRS_HOME/gr…

Eclipse中 如何实现 多行同时编辑

在编辑的时候按下 SHIFT ALT A 之后 鼠标变为 号 选择要同时编辑几行 即可编辑&#xff08;现在eclipse好像只能是编辑一块地方 不能像vs那样 任何地方可以同时编辑 这点很鸡肋&#xff09; 如图 退出编辑 再次 按 SHIFT ALT A 即可 转载于:https://www.cnblogs.com…

AFN\HTTPS\UIWebView

1.AFN使用技巧 1.在开发的时候可以创建一个工具类&#xff0c;继承自我们的AFN中的请求管理者&#xff0c;再控制器中真正发请求的代码使用自己封装的工具类。 2.这样做的优点是以后如果修改了底层依赖的框架&#xff0c;那么我们修改这个工具类就可以了&#xff0c;而不用再一…

检测和删除多余无用的css

本文主要讲解如何检测页面中多余无用的css。 1、chrome浏览器 F12审查元素的Audits 说明&#xff1a;使用Audits&#xff0c;会检测出页面中没有用到的css&#xff0c;需要手动删除多余的css&#xff1b;同时需要说明的是检测出多余无用的css块&#xff0c;而不是某一行css。 …

JDK 8的Calendar.Builder

勇敢的Java新世界的定义特征之一是Java空间中构建器模式的日益普及。 Groovy似乎是JVM上最流行的替代语言&#xff08;对于Java&#xff09;&#xff0c;以在核心库以及Groovy支持的库和框架中大量使用Builder而闻名。 乔希布洛赫与覆盖带来的图案为Java开发者社区心态前列模式…

oracle锁表会话超时时间,ORACLE快速彻底Kill掉的会话,防止锁表

ORACLE快速彻底Kill掉的会话,防止锁表2020-05-30编程之家收集整理的这篇文章主要介绍了ORACLE快速彻底Kill掉的会话,防止锁表&#xff0c;编程之家小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。万能是sql重启服务&#xff0c;不然&#xff0c;以下…

格式化文本

1.后台获取文本后文本内部存在回车&#xff0c;但是浏览器不能编译\n\t所以使用pre,使文本能够编译文本&#xff0c;2.若文本长度超出预设宽度&#xff0c;可以添加样式&#xff0c;下列代码&#xff0c;可以使超出后的文本自动换行。/*将文本解析为段落,是段落自动化行*/pre {…

webstorm快捷键

Ctrl/ 或 CtrlShift/ 注释&#xff08;// 或者/*…*/ &#xff09; ShiftF6 重构-重命名 CtrlX 删除行 CtrlD 复制行 CtrlG 查找行 CtrlShiftUp/Down 代码向上/下移动。 F2 或ShiftF2 高亮错误或警告快速定位 写代码&#xff0c;按Tab 生成代码 选中文本&#…

vue支付密码

从网上搜索了好多都很麻烦&#xff0c;花了点事件自己做了个&#xff0c;简单轻便&#xff0c;老少皆宜 <template> <section class"pay-mask" click"close_mask" v-show"payshow"> <div class"container"> <div…

打造智能建筑商

构建API时&#xff0c;您应该始终考虑谁将使用它。 当API简单易用时&#xff0c;用户就会感到满意。 当用户满意时&#xff0c;每个人也都会满意。 但是出色的可用性并非总是容易实现的。 有一些模式对此有所帮助&#xff0c;在这篇文章中&#xff0c;我将重点介绍经典的构建器…

结合BeautyEye开源UI框架实现的较美观的Java桌面程序

BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序&#xff0c;主要功能就是图灵机器人和一个2345网站万年历的抓取。。。。   挺简单而且实用的一个项目&#xff0c;实现出来的效果也还不错。希望可以学到知识的小可爱不对应该是帅哥&#xff0c;可…

oracle外表日期,三步教会您掌握oracle外表(external table)

三步教会你掌握oracle外表(external table)外表(externaltable)就像普通的表对像一样&#xff0c;可以select等&#xff0c;只是它是只读的&#xff0c;数据库中只保存了表结构的描述&#xff0c;表数据却没有存放在数据库内&#xff0c;而是存放在了文件系统上。当用户想偶尔使…

【从入门到放弃】23种设计模式(1):设计模式综述

一、设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式&#xff08;Factory Method&#xff09;、抽象工厂模式&#xff08;Abstract Factory&#xff09;、单例模式&#xff08;Singleton&#xff09;、建造者模式…

Bootstrap警告框

前面的话 在网站中&#xff0c;网页总是需要和用户一起做沟通与交流。特别是当用户操作上下文为用户提供一些有效的警示框&#xff0c;比如说告诉用户操作成功、操作错误、提示或者警告等。在Bootstrap框架有一个独立的组件&#xff0c;实现类似的效果&#xff0c;这个组件被称…