欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django模板层part

程序员文章站 2022-01-09 09:50:54
sailan一、自定义过滤器及标签1.1 自定义过滤器1.2 自定义标签一、自定义过滤器及标签当内置的无法满足需求时,这时我们就可以自定义,步骤如下;1.1 自定义过滤器第一步: 在settings中INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag;第二步: 在app中创建templatetags包(templatetags目录下需要有__init__.py文件,确保它是一个python的包,包名只能是templatetags,不能改);第三步:...



一、自定义过滤器及标签

当内置的无法满足需求时,这时我们就可以自定义,步骤如下;

1.1 自定义过滤器

第一步: 在settings中INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag;

Django模板层part
第二步: 在app中创建templatetags包(templatetags目录下需要有__init__.py文件,确保它是一个python的包,包名只能是templatetags,不能改);

第三步: 在包内新建py文件,文件名随意,但需保持一致性,方便后期使用,不与其他app冲突;

第四步: 新建文件内写代码;

#一、必须首先在模板*定义一个变量register,该变量值为template.Library的实例 from django import template
register = template.Library() # 变量名必须为register,不可改变 自定义过滤器是一个python函数,该函数需要12个参数,两个参数会一同传入 (1) 第一个参数来自过滤器左侧的变量(必须有) (2) 第二个参数来自过滤右侧的参数值(可有可无) 例如:针对自定义过滤器foo的使用 {{ var|foo:"bar" }},会执行foo(var,"bar") # 只有一个参数 @register.filter(name='cut') # name参数用来命名自定义过滤器 def my_upper(value): # 将指定的字符串大写转化 return value.upper() # 两个参数写法 def cut(value, arg): # 有两个参数 # 删除指定字符串 return value.replace(arg, '')

第五步: 模板内使用(需先load,再使用);

{% load my_tags %}
{{ 'aa'|my_upper }} {# 结果AA #}

1.2 自定义标签

前三步同上,这里直接续第四步写代码;

from django import template
register = template.Library() @register.simple_tag def my_multi_tag(v1, v2): return v1 * v2 # 自定义标签扩展之mark_safe #内置标签safe可以用来关闭转义,从而让标签内容有语法意义,但如果我们想让自定义标签处理的结果也有语法意义,则不能使用内置标签safe了,需要使用mark_safe,可以实现与内置标签safe同样的功能; from django.utils.safestring import mark_safe

@register.simple_tag def my_input_tag(id, name): res = "<input type='text' id='%s' name='%s' />" % (id, name) return mark_safe(res)

使用同过滤器需先load;

使用注意

  1. 自定义的标签及过滤器必须重启Django才生效;

  2. 自定义过滤器只可传两参数,标签可传多个;

二、模板的导入和继承

在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签,使用方法如下;

2.1 模板导入

第一步: 新建一个 xx.html,把好看的模板写入
Django模板层part

第二步: 在你想用的地方导入,语法如下;

# 作用:在一个模板文件中,引入/重用另外一个模板文件的内容, {% include '模版名称' %}

Django模板层part

效果:
Django模板层part

2.2 模板继承\派生

第一步: 我们需创建一个基本的骨架模板(母版),内部定义多处blocks;

例:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} 自定义title名 {% endblock %}</title> </head> <body> <div> {% block div1 %} <a href="">1111</a> <a href="">2222</a> <a href="">3333</a> <a href="">4444</a> {% endblock %} </div> <div> {% block div2 %} <p>你妈的</p> {% endblock %} </div> </body> </html>

extends标签于在一个模板文件中引入/重用另外一个模板文件的内容,include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容;

第二步: 新建HTML继承母版,并按照block标记做修改;

{% extends 'index1.html' %} {% block title %} sailan {% endblock %} {% block div1 %} {{ block.super }} # 该变量会将父模板中div1中原来的内容继承过来,然后可以在此基础上新增,否则就是纯粹地覆盖 <a href="">5555</a> <a href="">6666</a> {% endblock %} {% block div2 %} 帅的太自然 {% endblock %}

开机访问,检查元素,替换完成;
Django模板层part

三、静态文件配置

我们在编写模板文件时,需要大量引用css,js,图片等等静态文件,如果我们将这些文件在服务端存放的路径都固定写死的话会不利于后期拓展,解决方案如下;

3.1 单app下静态文件组织与使用

第一步: 找到目录下,settings.py,找到STATIC_URL修改如下;

STATIC_URL = '/static/' # 找到这一行,然后新增下述代码 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'statics'),# 获取静态文件在服务端的绝对路径 ] #STATIC_URL = '/static/'就是为静态文件的绝对路径起了一个别名,以后我们只需要用路径/static/即可

第二步: 在根目录下新增文件夹statics,为了更便于管理,可以在statics下新建子文件夹css、js、img等;
Django模板层part

第三步: 导入;

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> 方式一 <img src="/static/img/untitled1.jpg" alt=""> 方式二 {% load static %} <img src="{% static 'img/untitled1.jpg' %}" alt=""> 方式三 <img src="{% get_static_prefix %}img/untitled1.jpg" alt=""> 方式二起别名调用 {% static 'img/untitled1.jpg' as aaa%} <img src="{{ aaa }}" alt=""> 方式三起别名 {% get_static_prefix as bbb %} <img src="{{ bbb }}img/untitled1.jpg" alt=""> </body> </html> 

3.2 多app下静态文件的组织与使用

待补充

四、inclusion_tag的使用

本文地址:https://blog.csdn.net/msmso/article/details/109027726

相关标签: Django