Python笔记_48_Django模板层

本文深入讲解Django模板系统,包括变量、过滤器、标签的使用,以及自定义标签和过滤器的方法,帮助开发者掌握Django模板层的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板层

模板语法之变量

在 Django 模板中遍历复杂数据结构的关键是句点字符,
语法: {{ var_name }}

views.py

from django.shortcuts import render, HttpResponse, redirect


def temp_test(request):
    import datetime
    name_666 = "马具强"
    list1 = ['张国成', "张俊林", "陈桂涛"]
    dict1 = {'name':"张国城", "age":8, "sex":"female"}
    date = datetime.datetime.now()
    print(date.year)

    class Person(object):
        def __init__(self, name):
            self.name = name

        def eat(self):
            return "%s - chihuo" % self.name

    person_yuan = Person("yuan")  # 自定义类对象
    person_egon = Person("egon")
    person_alex = Person("alex")

    person_list = [person_yuan, person_egon, person_alex]

    return render(request, "temp_test.html", {"name": name_666,  # 让你区分前后端变量的区别
                                              'list1': list1,
                                              "dict1":None,
                                              "date": date,
                                              "person_list": person_list})

templates/temp_test.html

<h3>模板层</h3>


{#普通的变量#}
<h4>{{ name }}</h4>
<hr>
{#list#}
<p>{{ list1 }}</p>
{#根据索引取值  . 的形式#}
<p>{{ list1.0 }}</p>

<hr>
{#字典#}

<p>{{ dict1 }}</p>
{#字典取值,直接.key即可#}
<p>{{ dict1.name }}</p>
<p>{{ dict1.sex }}</p>

{#对象#}
<hr>
<p>{{ date.year }}</p>

<hr>
{#对象的属性和方法,直接点即可#}
<p>{{ person_list.0.name.upper }}</p>
<p>{{ person_list.0.eat }}</p>
模板语法之过滤器

语法:
{{obj|filter__name:param}} 过滤器最多只能有两个参数

views.py

def guo(request):
    import datetime
    name = "zhagnguocheng"
    num = 1024
    now = datetime.datetime.now()
    temp_str = "The fickleness of the world I have to make myself disguised as a hedgehog."
    value = "<a href='http://www.baidu.com'>点击</a>"

    return render(request, "guolvqi.html", {'name': name,
                                            "num": num,
                                            "now": now,
                                            "temp_str": temp_str,
                                            "value": value
                                            })

templates/filter.html

{#默认值 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。#}
<p>{{ name|default:"majuqiang" }}</p>

{#长度#}
<p>{{ name|length }}</p>

{#格式化文件大小#}
<p>{{ num|filesizeformat }}</p>   // 1.0kB

{#格式化时间#}
<p>{{ now|date:"Y-m-d" }}</p>

{#截断字符串#}
<p>{{ temp_str|truncatechars:10 }}</p>

{#safe#}
<p>{{ value|safe }}</p>

safe绝对安全的数据,才能加safesafe相当于jQuery里的html方法

模板语法之标签

标签看起来像是这样的:{% tag %}

  1. for循环

    {% for i in list %}
    	{{ i }}
    {% endfor %}
    
    {#for循环 dict#}
    {% for k,v in dict1.items %}
        <p>{{ k }} --- {{ v }}</p>
    {% empty %}
        <p>对不起。</p>
    {% endfor %}
    

    可以利用{% for i in list reversed %}反向完成循环。

  2. if控制语句

    {% if 条件 %}
    	...
    {% elif %}
    	...
    {% else %}
    	...
    {% endif %}
    
    <h3>标签</h3>
    {#for循环 list#}
    {% for i in person_list %}
     循环序号可以通过{{forloop}}显示 
    {#    序号从1开始#}
    {#    <p>{{ forloop.counter }}:{{ i.name }} === {{ i.eat }}</p> #}
    {#    序号从0开始#}
    {#    <p>{{ forloop.counter0 }}:{{ i.name }} === {{ i.eat }}</p>#}
    {#    倒序#}
    {#    <p>{{ forloop.revcounter }}:{{ i.name }} === {{ i.eat }}</p>#}
    {#    倒序,最后一个为0#}
    {#    <p>{{ forloop.revcounter0 }}:{{ i.name }} === {{ i.eat }}</p>#}
    
    {#     {% if forloop.first %}#}
    {#        {{ i.name }}|#}
    {#     {% endif %}#}
    
        {% if forloop.last %}
            {{ i.name }}
        {% else %}
            {{ i.name }} |
        {% endif %}
    
    {#    if 最后一条(true):#}
    {#        name #}
    {#    else:#}
    {#        name |#}
    
    {% endfor %}
    
  3. with
    使用一个简单地名字缓存一个复杂的变量

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    
  4. csrf_token

    放在form表单里面,这个标签用于跨站请求伪造保护
    在这里插入图片描述

自定义标签和过滤器
  • settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
    在这里插入图片描述
  • 在app中创建templatetags模块(模块名只能是templatetags)
    在这里插入图片描述
  • 创建任意 .py 文件,如:my_tags.py
from django import template
from django.utils.safestring import mark_safe


register = template.Library()   #register的名字是固定的,不可改变

@register.filter
def my_filter(v1, v2):
    return v1 * v2


@register.simple_tag
def my_tag1(v1, v2, v3):
    return v1 * v2 * v3


@register.simple_tag
def my_html(v1, v2):
    temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
    return mark_safe(temp_html)
  • 在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

    {% load my_tags %}

  • 使用simple_tag和filter(如何调用)

<body>
{% load my_tags %}
<h3>自定制过滤器</h3>
{{ 1|my_filter:2 }}

<hr>
<h3>自定制标签</h3>
{% my_tag1 1 2 3 %}
<p>{% my_html "id_test" "class_test" %}</p>

</body>

注意:filter可以用在if等语句后,simple_tag不可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值