django基础篇04-自定义simple_tag和fitler

自定义simple_tag

  • app目录下创建templatetags目录
  • templatetags目录下创建xxpp.py
  • 创建template对象register,注意变量名必须为register
  • @register.simple_tag
    def func(arg1,arg2):
        pass
  • settings.py文件中注册app,INSTALLED_APPS = ['app']
  • 模版文件顶部{% load xxoo %}
  • {{ 函数名 参数一 参数二}}

django如何传递参数给template对象的?

没错,就是通过views.py的函数传递,例如 render(request,'xxx.html',{'xx':'oo'}),还有其他的方式吗?其实还有url的方式传递参数,这里不再赘述

今天,我们讲解一下template对象,如何与py进行交互,这里的py是指单独的py文件,而不是基于django的py文件

下面看一段简单的代码

首先,我们在app01文件夹下创建一个templatetags目录,然后在创建xxoo.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.simple_tag
def simple_01():
    return 'Python'
xxoo.py

 然后模板文件index.html

{% load xxoo %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div>
        {% simple_01 %}
    </div>
</body>
</html>
index.html

注意:自定义simple_tag的4个注意事项

  1、在模版文件中 {% load py文件 %}

  2、settings.py文件中,注册app,本文自创建app01,所以在INSTALLED_APPS = ['app01']

  3、在app01目录下创建目录templatetags,注意必须在app01目录下

  4、创建template对象时,变量名固定,必须register,必须为register,必须为register

  5、必须重启服务

接下来神奇的事情发生了

进阶

在之前基础上,我们加上参数

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.simple_tag
def simple_02(a,b):
    return a + b
xxoo.py
{% load xxoo %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        {% simple_02 1 2 %}
    </div>
</body>
</html>
index.html

自定义filter

  • app目录下创建templatetags目录
  • templatetags目录下创建xxoo.py文件
  • 创建template的register对象,注意变量名必须为register
  • @register.filter
    def func(arg1,arg2):
        pass
  • settings.py中注册app,INSTALLED_APPS = ['app']
  • 模版文件顶部{% load xxoo %}
  • {{ 参数一|函数名:'参数二,参数三'}}  {{ 参数一|函数名:参数二 }},注意:函数名和参数二之间不能有空格
from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter
def simple_03(a,b):
    return a +'-'+ b
xxoo.py
{% load xxoo %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        {{ '张杰'|simple_03:'谢娜' }}
    </div>
</body>
</html>
index.html

自定义simple_tag和filter的优缺点

simple_tag

优点:可以传多个参数

缺点:不能作为if语句的条件

filter

优点:可以作为if语句的条件

缺点:参数最多只能传2个,而且不能有空格,其他的只能通过字符串拼接,然后在分割

原文地址:https://www.cnblogs.com/it-q/p/9396271.html