Django模版操作

if、for

语法结构

{% if .... %}//if的开始标识,表达式满足python语法即可,但不支持含小括号的条件
...
{% endif %}//结束标识


{% for var in mylist %} //这里遍历的只要是python中的可遍历数据结构即可
...
{% empty %}
...  #如果为遍历目标空,则会执行这一区块内容
{% endif %}//结束标识

if练习

Q:在模版中,完成四种基本运算的显示

形如 input1_____   (operation) input2_____ =  result

html模版代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/test_iffor" method="post">
    <input type="text" name="var1" value="{{ a }}">
    <label for="op">请选择操作:</label>

    <select name='op' id="op">
        <option value="1" {% if op == '1' %}selected{% endif %}>+</option>
        <option value="2" {% if op == '2' %}selected{% endif %}>-</option>
        <option value="3" {% if op == '3' %}selected{% endif %}>*</option>
        <option value="4" {% if op == '4' %}selected{% endif %}>/</option>
    </select>

    <input type="text" name="var2" value="{{ b }}">
    <input type="submit">
    <p>结果为{{ res }}</p>
</form>
</body>
</html>

代码解释

1.我用了两个type为text的文本输入框,并将变量分别命名为var1和var2

2.option中从1~4分别对应加减乘除,同时对应的op为对应的字符'1'到'4'

3.在option标签中加入了if语句,用于保持当前选择与op相同,不会在表单提交后重置

4.同样的,为了保持输入数据后不立马重置输入框,对输入框分别设置默认值为a和b

(这也意味着等会视图函数传入变量名也应为a和b)

视图函数

def test_calculater(request):
    from django.shortcuts import render
    if request.method == 'GET':
        return render(request, 'calculater.html')
    elif request.method == 'POST':
        a = float(request.POST['var1'])
        b = float(request.POST['var2'])
        op = request.POST['op']
        if op == '1':
            res = a + b
        elif op == '2':
            res = a - b
        elif op == '3':
            res = a * b
        else:
            res = a / b
        # dict = {"a": a, "b": b, "res": res, "op": op}
        return render(request, 'calculater.html', locals())  # 这里等效于传入了dict



#  配置路由如下
path("test_iffor",views.test_calculater),

#  接下来可以通过127.0.0.1:8000/test_iffor访问该页面

运行效果

for练习

for循环中的内置变量forloop,其有如下属性

示例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这是测试for循环模版</h1>
{% for var in lis %}
<p>{{ forloop }}  {{ var }}</p>
{% empty %}
传入列表为空
{% endfor %}

<h1>我是分隔行</h1>

{% for var in non %}
<p>{{ var }}</p>
{% empty %}
传入列表为空
{% endfor %}

</body>
</html>
#  视图函数及路由
def test_for(request):
    if request.method == 'GET':
        dict = {'lis': ['alice', 'bob', 'brown']}
        return render(request, 'test_for.html', dict)


path("test_for",view1.test_for)

运行效果

有了这个运行结果能够更清晰地理解内置变量forloop各种用法的作用


模版中的过滤器

对于safe:如果传入的字符串满足html语法,django会将其转义后作为纯文本显示在网页上

如果在传入后加上safe过滤器,该字符串也能起到对应的html/css/js效果

模版的继承

1.创建一个base.html文件

2.在可以被子模块修改的地方用↓包围起来

{% block block_name %}

{% endblock %}

一旦该block_name在子模块中被重定义则按子模块显示,如无则按base.html显示

3.创建子模块,删除初始化的html代码,取而代之只用写一行

{% extends 'base.html' %}

4.重写base.html中的各种块,名称一定要保持一致!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>