zoukankan      html  css  js  c++  java
  • Django之模板1

    Django模板

    一、变量(只需要记住两种特殊符号)

    {{  }} 和{% %}

    {{ }}表示变量,在模板渲染的时候替换成值,变量名由字母数字和下划线组成。

    {% %}表示逻辑相关的操作。

    点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值

    例子

    views中

    def index(request):
        title = '模板语言练习'
        lit = [0, 1, 2, 3, 4, 5]
        dic = {'name': '小明', 'age': 18}
    
        class Preson(object):
            def __init__(self,name,age,hobby):
                self.name = name
                self.age = age
                self.hobby = hobby
    
            def dream(self):
                return '我能反杀'
    
        p1 = Preson('卢本伟','88','游戏')
    
        return render(request, 'index.html', {'title': title, 'lit': lit, 'dic': dic,'p1':p1})

    模板中写入

    <h1>{{ title }}</h1>
    
    <h5>my name is {{ dic.name }},我今年{{ dic.age }}  |我要去{{ lit.3 }}个地方玩耍去</h5>
    
    
    <h5>我叫做{{ p1.name }},我今年{{ p1.age }}我的爱好是{{ p1.hobby }} 我经常有一个感觉那就是{{ p1.dream }}</h5>
    </body>

    输出结果是

    注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

    1. 在字典中查询
    2. 属性或者方法
    3. 数字索引

    二、Filters

    翻译为过滤器,用来修改变量的显示结果。

    语法: {{ value|filter_name:参数 }}

    '|'左右没有空格没有空格没有空格

     

    default  

    {{ value|default:"nothing"}}

    如果value值没传的话就显示nothing

    注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

    settings.py文件设置

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
                 'string_if_invalid': '找不到',   #这里设置后会替代default设置的nothing
            },
        },
    ]

     

    filesizeformat

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:

    {{ value|filesizeformat }}

    如果 value 是 123456789,输出将会是 117.7 MB。

    add

    给变量加参数

    {{ value|add:"2" }}

    value是数字4,则输出结果为6。

    {{ first|add:second }}

    如果first是 [1,.2,3] ,second是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6] 。

    lower

    小写

    {{ value|lower }}

    upper

    大写

    {{ value|upper}}

    title

    标题

    {{ value|title }}

    ljust

    左对齐

    "{{ value|ljust:"10" }}"

    rjust

    右对齐

    "{{ value|rjust:"10" }}"

    center

    居中

    "{{ value|center:"15" }}"

    length

    {{ value|length }}

    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    slice  

    切片

    {{value|slice:"2:-1"}}

    first

    取第一个元素

    {{ value|first }}

    last

    取最后一个元素

    {{ value|last }}

    join

    使用字符串拼接列表。同python的str.join(list)。

    {{ value|join:" // " }}

    truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:截断的字符数(超出范围就是用  ... 代替)

    {{ value|truncatechars:9}}

    date

    日期格式化

    {{ value|date:"Y-m-d H:i:s"}}

    settings文件中修改并加入 

    LANGUAGE_CODE = 'en-us'

    TIME_ZONE = 'UTC'

    USE_I18N = True

    USE_L10N = False #改成False

    USE_TZ = True

    DATETIME_FORMAT = 'Y-m-d H:i:s' #年月日时分秒 会变成 2018-10-8 12:10:10 这种格式
    DATE_FORMAT = 'Y-m-d'        # 年月日   会变成 2018-10-8      这种格式

     

    safe

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

    比如:

    value = "<a href='#'>点我</a>"

    {{ value|safe}}

     

    三、自定义的filter

    自定义过滤器只是带有一个或两个参数的Python函数:

    • 变量(输入)的值 - -不一定是一个字符串
    • 参数的值 - 这可以有一个默认值,或完全省略

    在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

    自定义filter代码文件放置位置

      

    编写自定义filter

     

    from django import template
    
    register = template.Library()  # 固定写法,生成一个注册实例对象
    
    
    @register.filter()  # 告诉Django的模板语言我现在注册一个自定义的filter
    def add_sb(value):
        """
        给任意指定的变量添加sb
        :param value: |左边被修饰的那个变量
        :return: 修饰后的变量内容
        """
        return value + 'sb'
    
    
    @register.filter()
    def add_str(value, arg):
        return value + arg

    对应的HTML模板

    {% load myfilter %}
    
    
    
    <p>{{ p1.name|add_sb}}</p>
    <p>{{ p1.name|add_str:'zhen shi da s b'}}</p>
    

    四 、Tags

     for

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
    </ul>

    for循环可用一些参数

    VariableDescription
    forloop.counter 当前循环的索引值(从1开始)
    forloop.counter0 当前循环的索引值(从0开始)
    forloop.revcounter 当前循环的倒序索引值(从1开始)
    forloop.revcounter0 当前循环的倒序索引值(从0开始)
    forloop.first 当前循环是不是第一次循环(布尔值)
    forloop.last 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环

     for ... empty

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>空空如也</li>
    {% endfor %}
    </ul>

    if,elif和else

    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}

    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

    with定义一个中间变量

    {% with p1.name as name  %}
    
        <p>{{ name }}</p>
    
    {% endwith %}

    五 、csrf_token

    这个标签用于跨站请求伪造保护。

    在页面的form表单里面写上{% csrf_token %}

    (之前settings文件中的注释的可以解封了)

      注意事项

    1. Django的模板语言不支持连续判断,即不支持以下写法:

    {% if a > b > c %}
    ...
    {% endif %}

    2. Django的模板语言中属性的优先级大于方法

  • 相关阅读:
    Java并发容器和线程池
    CountDownLatch、CyclicBarrier
    spring data jpa
    转换时间的工具类(1)
    swagger 报错: TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot h
    自动生成entry-mapper-service-controller
    Hutool工具包导出Excel文件异常 You need to add dependency of poi-ooxml to your project
    Java获取24小时制的时间方法
    查询全国城市行政区
    Java对象与Json字符串之间的转化
  • 原文地址:https://www.cnblogs.com/clbao/p/9757537.html
Copyright © 2011-2022 走看看