Django框架之模版变量及循环分支

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

模板层

Django中的HTML文件并不是一个简单的前端页面,他支持多种渲染方式;

比如Smart或是Jinja这样出名的模板语言引擎,默认django使用的是templates引擎来进行模板页面的渲染,这也被称为Django模板语言(DTL)

  • 模板语言主要有模板变量模板标签
<div> {
   
   { 模板变量 }} </div>
<div> {% 模板标签 %} </div>
  • 模板变量通过视图函数传递字典变量,字典的key值为对应模板变量名,对应value是模板变量实际被渲染的值
def index(request):
	content = {
    
    'account':'test'}
	return render(request,html,content)
  • 最终渲染结果
<div> test </div>

模板引擎遇到这个变量,将会计算他,并且将结果覆盖;

如果视图函数中,并没有给这个模板变量赋值,也没有关系,模板会自动将这个{ { account }}处理为一个空

  • 注意:模板变量名,只能以字母数字下划线构成,下划线不可以打头,并且也不可以使用表单符号组成模板变量

模版变量获取方式

当我们返回的是一个字符串数据,这应该是最简单的处理方式,前端模板会直接将它展示到页面中。

如果返回的是一个列表序列数据或者字典键值对数据,我们可以使用模板语言中的.符号来进行其中值的获取,当模板变量中有符号.的存在时,比如content.key他会按照如下顺序来进行查找:

  1. 字典查找:content[key]
  2. 对应属性和方法查找:content.key;因为对应key值的查找优先级要低于属性方法,所以要尽量避免使用数据内置方法作为key值
  3. 序列索引方式查找:content[index]

Python数据在模板中的应用

Python常用数据有int,float,str,list,tuple,dict,set等;把他们都通过模板变量传递到模板页面试试

def index(request):
    int_ = 123
    float_ = 0.123 
    str_ = 'str'
    list_ = ['l','i','s','t']
    tuple_ = ('t','u','p','l','e')
    dict_ = {
    
    "key":"value"}
    set_ = {
    
    's','e','t'}
    return render(request,"index.html",locals())
  • locals():该函数将当前作用域下的所有变量名和对应变量值组成字典,免去了我们构造存储字典的麻烦
<p>{
   
   { int_ }}</p>
<p>{
   
   { float_ }}</p>
<p>{
   
   { str_ }}</p>
<p>{
   
   { list_ }}</p>
<p>{
   
   { tuple_ }}</p>
<p>{
   
   { dict_ }}</p> <p>{
   
   { dict_.key }}</p>
<p>{
   
   { set_ }}</p>

到了模板页面上,这些变量值其实也都像变成了字符串一样,直接展示

123

0.123

str

['l', 'i', 's', 't']

('t', 'u', 'p', 'l', 'e')

{'key': 'value'}

{'e', 's', 't'}

for 标签

使用模板中使用标签语言{% for %}{% endfor%},对视图函数传递的数据集进行遍历访问,比如上面传递的字符串,列表,元祖,字典,集合这样的数据

和普通模板变量不同,模板标签使用大括号百分号的组合{% lag %},具有有一些特殊的功能性

模板中的标签{% for %}与Python中的for循环类似,要记得有闭合模板标签{ { endfor }}

{% for var in sequence %}
	{
   
   { var }}
{% endfor %}
  • 来把上面的数据进行访问
{% for var in str_ %}
    <p>{
   
   { var }}</p>
{% endfor %}
---------------------
{% for var in list_ %}
    <p>{
   
   { var }}</p>
{% endfor %}
---------------------
{% for var in tuple_ %}
    <p>{
   
   { var }}</p>
{% endfor %}
---------------------
{% for var in set_ %}
    <p>{
   
   { var }}</p>
{% endfor %}

看到的效果和在Python中迭代访问的结果是差不多的,并且模板循环还会使对应的标签也进行循环

接下来通过模板循环从字典中取出来的是字典的key值

{% for var in dict_ %}
	<p>{
   
   { var }} {
   
   { dict_.var}}</p>
{% endfor %}

在for循环遍历访问字典的时候,不能再像Python语法里一样,直接通过迭代获取key之后通过dict[key]或是dict.key,拿到对应value;

模板变量不会把var解释成取到的对应key值,var只是作为了一个单纯的var字符串,除非在字典中,有var字符串做为字典的键值,否则是取不到的

正确的对字典中键值对进行获取的方式是通过内置字典items属性:

{% for key,value in dict_.items %}
    <p>{
   
   { key }} {
   
   { value}}</p>
{% endfor %}
  • 注意:模板语言中,不会出现索引超出范围的IndexError或者Key值不存在的KeyError,取不出任何东西则只是一个空

{% for %}循环中,我们还可以使用很多有用的模板变量,方便我们控制循环

{% for var in iterable %}
	{
   
   { forloop.counter }} <!--当前循环次数,从1开始计数 -->
	{
   
   { forloop.counter0 }} <!--当前循环次数,从0开始计数 -->
	{
   
   { forloop.revcounter }} <!--当前循环次数,从最大长度开始 -->
	{
   
   { forloop.revcounter0 }} <!--当前循环次数,从最大索引开始 -->
	{
   
   { forloop.first }} <!-- 判断是否为第一次循环 -->
	{
   
   { forloop.last }} <!-- 判断是否为第一次循环 -->
	{
   
   { forloop.parentloop }} <!-- 当循环嵌套时,访问上层循环 -->
{% endfor %}

通过{% empty %}标签判断迭代对象是否为空

{% for var in test_list %}
	{
   
   { var }}
{% empty %}
	空空如也
{% endfor %}

if 标签

在模版中,可以通过{% if %}标签语法来进行模板变量的值判断;

{% if test_list %}
    列表不为空
{% elif test_dict %}
    列表为空,字典不为空
{% else %}
	列表字典均为空
{% endif %}

并且if标签还支持andornot来进行变量的布尔判断

{% if test_list and test_dict %}
    列表、字典均不为空
{% endif %}
{% if not test_list %}
    列表为空时才能满足IF条件判断
{% endif %}
{% if test_list or test_dict %}
    列表、字典某一个不为空
{% endif %}
{% if not test_list or test_dict %}
    列表为空或字典不为空
{% endif %}
{% if test_list and not test_dict %}
    列表不为空并且字典为空
{% endif %}

也支持同时使用and及or语句,但是and的条件判断优先级要高于or语句

{% if a or b and c %}
等同于
{% if a or (b and c) %}

if标签还支持==!=><>=<=的判断用法

{% if var == "1" %}
	这个值是"1"
{% endif %}
{% if var != "x" %}
	判断不相等成立
{% endif %}
{% if var < 100 %}
    var大于100
{% endif %}
{% if var >= 100 %}
    var大于100
{% endif %}
  • 注意:如果判断的数据类型在后台传递到模板变量时具体数值类型为整型或浮点型而不是字符串;不需要在判断的时候加字符串的标识引号

在模板语言中,不支持连续判断

{% if 100 > var > 50 %}
    var大于50小于100
{% endif %}

应该使用and语句写成这样

{% if 100 > var and var > 50 %}
    var大于50小于100
{% endif %}

除去运算符之外,if标签还支持innot in的判断运算

{% if 1 in test_list %}
    列表中有数字1
{% endif %}

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121361839