过滤器,simple_tag,inclusion_tag,模板继承

1. 介绍

过滤器:最多两个参数,第一个为自动传入的,第二个为自己的(可以省略)

simple_tag:加强版的过滤器,参数无限制

inclusion_tag:公共的模板,或者动态展示模板数据,推荐使用

  • simple_tag (简单标签 : 处理数据,返回一个字符串或者给context设置或添加变量。

  • inclusion_tag (包含标签) : 处理数据,返回一个渲染过的模板。

  • 加上不同的装饰器作用不同
    • 装饰器为filter,参数最多只能是两个
    • 装饰器为simple_tag和inclusion_tag,参数不受限制
  • filter 和 simple_tag 返回值比较直接,直接写在调用的部分
  • inclusion_tag 返回值为字典,字典中夹杂变量,变量要交给模板中做渲染,最后输出到调用的地方
  • 在html中调用方式不同
    • filter 调用语法为 { { }},这种调用语法是可以写在if判断 等语句中
    • filter 和 simple_tag 调用语法为 {% %} ,这种不能用于if判断等语法中

1.  过滤器

内置

过滤器 例子
lower, upper { { article.title | lower }} 大小写
length { { name | length }} 长度
default { { value | default: "0" }} 默认值
date { { picture.date | date:"Y-m-j" }} 日期格式
dicsort { { value | dicsort: "name" }} 字典排序
escape { { title | escape }} 转义
filesizeformat { { file | filesizeformat }} 文件大小
first, last { { list | first }} 首或尾
floatformat { { value | floatformat }} 浮点格式
get_digit { { value | get_digit }} 位数
join { { list | join: "," }} 字符连接
make_list { { value | make_list }} 转字符串
pluralize { { number | pluralize }} 复数
random { { list | random }} 随机
slice { { list | slice: ":2" }} 切
slugify { { title | slugify }} 转为slug
striptags { { body | striptags }} 去除tags
time { { value | time: "H:i" }} 时间格式
timesince { { pub_date | timesince: given_date }}
truncatechars { { title | truncatechars: 10 }} 
truncatewords { { title | truncatewords: 2 }} 
truncatechars_html { { title | truncatechars_html: 2 }}
urlencode { { path | urlencode }} URL转义
wordcount { { body | wordcount }} 单词字数

自定义

介绍

  • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
  • 在templatetags包中创建py文件,文件可以自定义
  • 不起名称,默认是函数名

定义

from django import template
register = template.Library()


@register.filter
def fill(value, arg):
    return value.replace(" ", arg)


@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)

使用

# 使用自定义filter
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{
   
   { somevariable|fill:"__" }}
{
   
   { d.name|addSB }}

simple_tag的使用

介绍

  • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
  • 在templatetags包中创建py文件,文件可以自定义
  • 不起名称,默认是函数名

定义

from django import template
import datetime
from blog.models import Article

register = template.Library()

# use simple tag to show string
@register.simple_tag
def total_articles():
    return Article.objects.filter(status='p').count()

# use simple tag to set context variable
@register.simple_tag
def get_first_article(name='aaa'):
    return Article.objects.filter(status='p').order_by('-pub_date')[0]

使用

# 导入
{% load blog_extras %}



<p>文章数: {% total_articles %}</p>



{% aaa %}
<p>第一篇文章: </p>
<p>{
   
   { aaa.title }}</p>

inclusion_tag

介绍

  • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
  • 在templatetags包中创建py文件,文件可以自定义

定义

from django import template
from blog import models
from django.db.models import Count
 
register=template.Library()
@register.inclusion_tag('left_tag.html')
def left_panel(username):
    user_obj = models.UserInfo.objects.filter(username=username).first()
    blog = user_obj.blog
    # 文章分类
    category_article_list = models.Category.objects.filter(blog=blog).annotate(num=Count('article')).values('title',                                                                                                       'num')
    # 标签分类
    tag_article_list = models.Tag.objects.filter(blog=blog).annotate(num=Count('article')).values('title', 'num')
    # 时间分类auth_group
    time_archive_list = models.Article.objects.filter(user__username=username).extra(
        select={'ym': 'DATE_FORMAT(create_time,"%%Y-%%m")'}
    ).values('ym').annotate(num=Count('nid')).values('ym', 'num')
 
    return {
        'username': username,
        'category_article_list': category_article_list,
        'tag_article_list': tag_article_list,
        'time_archive_list': time_archive_list,
    }

left_tag.html

<div class="panel panel-primary">
    <div class="panel-heading">
        <h3 class="panel-title">文章分类</h3>
    </div>
 
    <div class="panel-body">
        <ul class="panel-ul">
        {% if not category_article_list  %}
                <li>没有此分类</li>
            {% else %}
            {% for category_article in category_article_list %}
                 <li><a href="/blog/{
   
   { username }}/category/{
   
   { category_article.title }}">{
   
   { category_article.title }}({
   
   { category_article.num }})</a></li>
            {% endfor %}
        {% endif %}
        </ul>
    </div>
</div>
<div class="panel panel-success">
     <div class="panel-heading">
        <h3 class="panel-title">标签分类</h3>
    </div>
    <div class="panel-body">
        <ul class="panel_ul">
            {% if not tag_article_list  %}
                <li>没有此分类</li>
            {% else %}
                {% for tag_article in tag_article_list %}
                 <li><a href="/blog/{
   
   { username }}/tag/{
   
   { tag_article.title }}">{
   
   { tag_article.title }}({
   
   { tag_article.num }})</a></li>
                {% endfor %}
            {% endif %}
        </ul>
    </div>
</div>
<div class="panel panel-info">
     <div class="panel-heading">
        <h3 class="panel-title">时间归档</h3>
    </div>
    <div class="panel-body">
          <ul class="pane_ul">
            {% if not time_archive_list  %}
                <li>没有此分类</li>
            {% else %}
                 {% for time_archive in time_archive_list %}
                <li><a href="/blog/{
   
   { username }}/archive/{
   
   { time_archive.ym }}">{
   
   { time_archive.ym }}({
   
   { time_archive.num }})</a></li>
                {% endfor %}
            {% endif %}
        </ul>
    </div>
</div>

使用

 {% load mytag %}
 {% left_panel username %}

模板继承

介绍

Django支持模板的继承。你需要使用extends标签。

模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。

父模板

 新建xxx.html模板文件,在需要替换的不同位置,加上不同名称的block标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--区域1默认区域不可以被子模板修改-->
    <title>

    {% block title %}

    Welcome to  

    {% endblock title %}

</title>
</head>
<body>

<p>尊敬的用户您好:</p>
<hr>
<!--区域2可以被子模板重写-->
{% block content %}
<p>这是主体内容可以被子模板重写</p>
{% endblock content %}
<hr>
<!--区域3可以被子模板重写-->
{% block footer %}
<p>这是结尾的内容也可以被重写</p>
{% endblock footer %}
</body>
</html>

子模板

1. 在新的子html文件开头写:{% extends "父模板" %}

2.  接下来重写模板中的block标签内容:

 注意:每个block标签不能同名,可以有多个(一般css/js/内容都可以有)

{% block content %}

……

{% endblock %}或者{% endblock content %}

3. 要想继承保留模板block中的内容,在重写时加上

{ { block.super }}

{% extends 'index/base.html' %}
<!--重写title-->
{% block title %} 欢迎你学习Django教程 {% endblock %}
<!--区域1保持父模板默认状态-->
<!--对父模板的区域2进行重写-->
{% block content %}
{% for item in course %}
<li>{
   
   { item }}</li>
{% endfor %}
{% endblock content %}
{% block footer %}<p>最后希望<span style="color:red">{
   
   { name }}</span>在C语言中文网学习可以学有所成</p>
{% endblock footer %}

参考文章

(15条消息) Django自定义过滤器_stu_xujin的博客-CSDN博客

Django 自定义过滤器、simple_tag、inclusion_tag、mark_safe - Star-Hitian - 博客园 (cnblogs.com)

 (15条消息) django中的simpletag和inclusion-tag_qq_26914391的博客-CSDN博客

Django基础篇 06-Django模板过滤器Filter和标签Tags - 捞铁 - 博客园 (cnblogs.com) 

(15条消息) Django模版语言inclusion_tag的用法。_miaoqinian的博客-CSDN博客_inclusion_tag 

猜你喜欢

转载自blog.csdn.net/qq_52385631/article/details/126953030