ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django之模板层

2022-05-17 00:34:33  阅读:103  来源: 互联网

标签:index py tag django html 模板 页面


django之模板层

模板语法之过滤器

语法结构

{{数据对象|过滤器名称:参数}} 过滤器最多只能额外传输一个参数

常见过滤器

1.统计数据的长度 length

# views.py 层
def index(request):
    s = '哈哈哈哈'
    return render(request, 'index.html',locals())
# index 页面
<p style="font-size: 30px">{{ s|length }}</p>
image-20220516192122414

2.算术加法或者字符串加法 add

# index页面
<p style="font-size: 30px">{{ s|add:'你好' }}</p>
image-20220516192320878

3.将数字转换成合适的文件计量单位 filesizeformat

# views.py 视图层
def index(request):
    s = '哈哈哈哈'
    file_size = 22222
    return render(request, 'index.html',locals())
# index 页面
<p style="font-size: 30px">{{ file_size|filesizeformat }}</p>
image-20220516192705318

4.判断当前数据对象对应的布尔值是否是False

# index 页面
    <p style="font-size: 30px">{{ s|length }}</p>
    <p style="font-size: 30px">{{ file_size|filesizeformat }}</p>
    <p style="font-size: 30px">{{ b|default:'判断前面的值是否为FLASE' }}</p>
# views.py 视图层
def index(request):
    s = '哈哈哈哈'
    file_size = 22222
    b = False
    return render(request, 'index.html',locals())

判断一个变量的值是false还是True。如果值为false 则显示default后面的内容 反之,则显示原来的内容

image-20220516193638172

5.时间格式化 date

# html 页面
<p style="font-size: 30px">{{ c_time|date:'Y-m-d'}}</p>
# views.py 视图层
from datetime import datetime
    c_time = datetime.today()
image-20220516194406772

6. 索引切片 slice

<p style="font-size: 30px">{{ s|slice:'0:2'}}</p>
image-20220516194619485

7.按照空格截取指定个数的文本 truncatewords

# html 页面
<p style="font-size: 30px">{{ s|truncatewords:1 }}</p>
# views.py 视图层
s = '哈哈哈哈 hello world'
image-20220516201202611

8.按照字符个数截取文本(包含三个点)

<p style="font-size: 30px">{{ s|truncatechars:8}}</p>
image-20220516201616434

9. 移除指定的字符 cut

# html 
<p style="font-size: 30px">{{ info|cut:'|'}}</p>
# views.py 视图层
info = 'jason|123|male'
image-20220516201934949

10.是否取消转换 safe

1. 没转换之前
# html 页面
<p style="font-size: 30px">{{ tag}}</p>
# views.py 视图层
tag = '<h1>这是一个h1标签</h1>'
image-20220516202803095
2.转换之后
<p style="font-size: 30px">{{ tag|safe}}</p>
# views.py 视图层
tag = '<h1>这是一个h1标签</h1>'

image-20220516202853892

当然这是在html页面上加约束,也可以在后端加约束 eg:

# html 页面
<p style="font-size: 30px">{{ res}}</p>
# views.py 视图层
from django.utils.safestring import mark_safe
    back_tag = '<h1>这是一个h1标签</h1>'
    res = mark_safe(back_tag)

image-20220516203210831

模板语法之标签

1.语法结构

{% 名字 ... %}
{% end名字%}

2.if 判断

{% if 条件1 %}
    <p>你好啊</p>
  {% elif 条件2 %}
    <p>他好呀</p>
  {% else %}
    <p>大家好</p>
  {% endif %}

3.for 循环

# forloop 关键字
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

# html 页面
{% for foo in l1 %}
    {% if forloop.first %}
    <p>这是第一次循环</p>
    {% elif forloop.last %}
    <p>这是最后一次循环</p>
    {% else %}
    <p>中间循环</p>
    {% endif %}
    {% empty %}
    <p>当前循环对象为空</p>
{% endfor %}
image-20220516222420811

同样支持字典

# html 页面
{% for foo in user_dict %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.keys %}
{{ foo }}
{% endfor %}
{% for foo in user_dict.items %}
{{ foo }}
{% endfor %}
# views.py 视图层
user_dict = {'name':'jason','pwd':123}

image-20220516222828501

自定义过滤器、标签、inclusion_tag

自定义过滤器的前提

"""
1.在应用下需要创建一个名为templatetags的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
	from django import template
	register = template.Library()
"""

自定义过滤器:只能接收两个参数

{% load mytag %}
{{ n1|my_index:666 }}
# mytag.py 文件内写以下内容
@register.filter(is_safe=True,name='my_index')
def index(a,b):
    return a + b

自定义简单标签:可以接收任意的参数

# mytag.py 文件内写以下内容
@register.simple_tag(name='mytag')
def func(a,b,c,d):
    return a+b+c+d
# html 文件
{% load mytag %}
{% mytag 1 2 3 4 %}

自定义inclusion_tag

# mytag.py 内的代码
@register.inclusion_tag('left.html')
def func(n):
    l1 = []
    for i in range(1,n+1):
        l1.append(f'第{i}页')
    return locals()
# left.html 文件
<ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}

</ul>
# index.html 文件
{% load mytag %}
{% func 10 %}
image-20220516230717840

该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置

模板的继承

类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源
  
有很多网站的很多页面 其实都是差不多的 只是局部有所变化 模板的继承可以很好的实现该需求

1.先在模板中通过block划定将来可以被修改的区域
	{% block content %}
  	<h1>主页内容</h1>
  {% endblock %}
2.子板继承模板
	{% extends 'home.html' %}
3.修改划定的区域
	{% block content %}
    <h1>登录内容</h1>
	{% endblock %}
4.子页面还可以重复使用父页面的内容
	{{ block.super }}
"""
模板上最少应该有三个区域
	css区域、内容区域、js区域
子页面就可以有自己独立的css、js、内容
"""

模板的导入

类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示

eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
  	策略1:拷贝多份即可
    策略2:模板的导入
   
使用方式 如下:
image-20220516231519490
# index.html
{% include 'home.html' %}
{% include 'home.html' %}
{% include 'home.html' %}
image-20220516231604652

注释语法补充

<!---->  是HTML的注释语法
{##}		 是django模板语法的注释
"""
HTML的注释可以在前端浏览器页面上直接查看到
模板语法的注释只能在后端查看 前端浏览器查看不了
"""

测试环境搭建

前期数据准备

"""
django自带的sqlite3数据库 功能很少 并且针对日期类型不精确

1.数据库正向迁移命令(将类操作映射到表中)
	python3 manage.py makemigrations
  python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
	python3 manage.py inspectdb
"""
需求
	我们只想操作orm 不想使用网络请求
  	需要有专门的测试环境
    1.自己搭建
    	import os
			if __name__ == "__main__":
    			os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    			import django
    			django.setup()
    2.pycharm提供
    	python console

orm关键字使用

标签:index,py,tag,django,html,模板,页面
来源: https://www.cnblogs.com/yt99/p/16279227.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有