• Django 模版语言


    传入变量

    {{ 变量名 }}

    在 view.py 的函数返回 render 时在html文件名后传入一个字典,字典的 key 对应html文件中的变量名,value 为传入的值
    views.py:

    def func(request):
    	return render(request, "index.html", {'current_user': "bob"})
    

    index.html:

    <body>
    	<div>{{current_user}}</div>
    </body>
    

    最后生成的字符串

    <body>
    	<div>bob</div>
    </body>
    
    

    循环

    For循环

    views.py:

    def func(request):
    	return render(request, "index.html", {'current_user': "bob", 'user_list': ['bob','jack']})
    

    index.html:

    <body>
    	<div>{{current_user}}</div>
    	<ul>
    		{% for row in user_list %}
    			{% if row == "bob" %}
    				<li>{{ row }}</li>
    			{% endif %}
    		{% endfor %}
    	</ul>
    </body>
    
    字典循环

    views.py:

    USER_DICT = {
            '1': {'name': 'user1', 'age': '12', 'gender': 'M'},
            '2': {'name': 'user2', 'age': '12', 'gender': 'M'},
            '3': {'name': 'user3', 'age': '12', 'gender': 'M'},
            '4': {'name': 'user4', 'age': '12', 'gender': 'M'},
        }
    def show_dict(request):
        return render(request, 'dict.html', {'user_dict': USER_DICT})
    

    index.html:

    • .keys: 只显示 key(默认状态)
    <body>
    	<ul>
    	    {% for i in user_dict.keys %}
    	        <li>{{ i }}</li>
    	    {% endfor %}
    	</ul>
    </body>
    

    输出:

    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    
    • .values: 只显示 value
    <body>
    	<ul>
    	    {% for i in user_dict.values %}
    	        <li>{{ i }}</li>
    	    {% endfor %}
    	</ul>
    </body>
    

    输出:

    <li>{'name': 'user1', 'age': '12', 'gender': 'M'}</li>
    <li>{'name': 'user2', 'age': '12', 'gender': 'M'}</li>
    <li>{'name': 'user3', 'age': '12', 'gender': 'M'}</li>
    <li>{'name': 'user4', 'age': '12', 'gender': 'M'}</li>
    
    • .items: 同时显示 key 和 value
    <body>
    	<ul>
    	    {% for i in user_dict.items %}
    	        <li>{{ i }}</li>
    	    {% endfor %}
    	</ul>
    </body>
    

    输出:

    <li>('1', {'name': 'user1', 'age': '12', 'gender': 'M'})</li>
    <li>('2', {'name': 'user2', 'age': '12', 'gender': 'M'})</li>
    <li>('3', {'name': 'user3', 'age': '12', 'gender': 'M'})</li>
    <li>('4', {'name': 'user4', 'age': '12', 'gender': 'M'})</li>
    

    <body>
    	<ul>
    	    {% for k, v in user_dict.items %}
    	        <li>{{ k }}:{{ v }}</li>
    	    {% endfor %}
    	</ul>
    </body>
    

    输出:

    <li>1:{'name': 'user1', 'age': '12', 'gender': 'M'}</li>
    <li>2:{'name': 'user2', 'age': '12', 'gender': 'M'}</li>
    <li>3:{'name': 'user3', 'age': '12', 'gender': 'M'}</li>
    <li>4:{'name': 'user4', 'age': '12', 'gender': 'M'}</li>
    

    示例:
    通过 a 标签提交 get 请求

    <ul>
    {#/detail/?nid= 方式#}
        {% for k, v in user_dict.items %}
            <li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li>
        {% endfor %}
    </ul>
    
    <li><a target="_blank" href="/detail/?nid=1">user1</a></li>
    <li><a target="_blank" href="/detail/?nid=2">user2</a></li>
    <li><a target="_blank" href="/detail/?nid=3">user3</a></li>
    <li><a target="_blank" href="/detail/?nid=4">user4</a></li>
    
    循环计数
    {% for i in list %}
    	{{ forloop.counter }}   # 正序从1开始计数
    	{{ forloop.counter0 }}  # 正序从0开始计数
    	{{ forloop.revcounter }}    # 倒序从1开始计数
    	{{ forloop.revcounter0 }}   # 倒序从0开始计数
    	{{ forloop.parentloop }}    # 父循环计数,返回字典,包含forloop的所有七项(用于两层循环)
    	{{ forloop.first }} # 是否为第一个
    	{{ forloop.last }}  # 是否为最后一个
    {% endfor %}
    

    索引

    模版语言中不使用'[]'进行索引,而是直接'.'

    views.py:

    def func(request):
    	return render(request, "index.html", {
    				'current_user': "bob", 
    				'user_list': ['bob','jack'], 
    				'user_dict': {'k1': 'v1', 'k2': 'v2'}})
    

    index.html:

    	<body>
    		<div>{{current_user}}</div>
    		<a> {{ user_list.1 }} </a>
    		<a> {{ user_dict.k1 }} </a>
    		<a> {{ user_dict.k2 }} </a>
    	</body>
    

    判断

    条件

    views.py:

    def func(request):
    	return render(request, "index.html", {
    				'current_user': "bob", 
    				"age": 18,
    

    index.html:

    	<body>
    		<div>{{current_user}}</div>
    		{% if age %}
    			<a>有年龄</a>
    			{% if age >= 18 %}
    				<a>成年</a>
    			{% else %}
    				<a>未成年</a>
    			{% endif %}
    		{% else %}
    			<a>无年龄</a>
    		{% endif %}
    	</body>
    

    母版

    {% block %}

    母版通过{% block name %}{% endblock %}确定子板插入位置
    母版 html 文件
    master.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>master</title>
        <link rel="stylesheet" href="/static/common.css">
        {% block css %}{% endblock %}
        {# 插入CSS文件位置 #}
    </head>
    <body>
    
    <div id="header">This is header</div>
    
    <div>
        <div id="left_menu">
            <a href="/block-1.html">
                <p>page1</p>
            </a>
            <a href="/block-2.html">
                <p>page2</p>
            </a>
            <a href="/block-3.html">
                <p>page3</p>
            </a>
        </div>
        <div id="content">
            {% block content %}{% endblock %}
        </div>
    
    </div>
    
    <div id="footer">This is footer</div>
    
    </body>
    <script src="/static/jQuery3.4.1.js"></script>
    {% block js %}{% endblock %}
    {# 插入JS文件位置 #}
    </html>
    

    子板 html 文件

    {% extends 'master.html' %}
    {# 确定要应用的母版 #}
    
    {% block css %}{% endblock %}
    {# 插入CSS文件 #}
    
    {% block content %}
        <div>
            <h1>This is page1.</h1>
            {% include 'tag.html' %}
            {% include 'tag.html' %}
            {# 下面介绍{% include 'tag.html' %} #}
        </div>
    {% endblock %}
    {# 插入内容 #}
    
    {% block js %}{% endblock %}
    {# 插入JS文件 #}
    
    {% include %}

    一个子板只能继承一个母版,但是可以插入多个 include
    tag.html:

    <a>一个小插件</a>
    

    {% include 'tag.html' %}会将整个html文件插入到指定位置

    自定义函数

    simple_tag

    缺点:
    不能作为if条件
    优点:
    可以传入任意数量参数,参数之间用空格隔开
    步骤:
    1.app下创建templatetags目录
    2.目录下创建func.py文件
    3.导入模块,创建对象

    from django import template
    
    register = template.Library()
    

    4.写函数

    @register.simple_tag
    def func_s(a1, a2):
        return a1 + a2
    

    5.settings中注册APP
    6..html文件顶部加载函数所在.py文件
    {% load func %}
    7.使用函数
    {% func_s 2 4 %}

    filter

    缺点:
    最多传入两个参数,不能加空格(可以将多个参数打包成一个参数传入,在函数中在解析)
    优点:
    能作为if条件
    步骤:
    1.app下创建templatetags目录
    2.目录下创建.py文件
    3.导入模块,创建对象

    from django import template
    
    register = template.Library()
    

    4.写函数

    @register.filter()
    def func_f(a1, a2):
        return a1 + a2
    

    5.settings中注册APP
    6..html文件顶部加载函数函数所在.py文件
    {% load func %}
    7.使用函数
    {{ 2|func_f:4 }}

  • 相关阅读:
    paip.解决Invalid byte 2 of 2byte UTF8 sequence.
    poj1157
    poj1258
    poj1160
    poj1113
    poj1159
    !!!GRETA正则表达式模板类库
    【原创】C#与C++的混合编程采用其中的第三种方法
    WinApi.cs
    C#:正则表达式30分钟入门教程
  • 原文地址:https://www.cnblogs.com/dbf-/p/10880221.html
Copyright © 2020-2023  润新知