Django模版操作

if、for

语法结构

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


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

if练习

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

形如 input1_____ (operation) input2_____ = result

html模版代码

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)

视图函数

python 复制代码
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,其有如下属性

示例代码

html 复制代码
<!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>
python 复制代码
#  视图函数及路由
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中的各种块,名称一定要保持一致!

相关推荐
DBA小马哥2 小时前
时序数据库迁移替换与时序数据库分片
数据库·时序数据库
DBA小马哥2 小时前
时序数据库迁移方案在物联网设备监测中的实践与性能突破
数据库·物联网·时序数据库
ID_180079054732 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记
ruleslol8 小时前
MySQL的段、区、页、行 详解
数据库·mysql
while(1){yan}8 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
奋进的芋圆8 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
それども8 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊8 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
计算机程序设计小李同学8 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
富士康质检员张全蛋9 小时前
JDBC 连接池
数据库