Django 学习 之 模板(html)与配置静态文件

Stella981
• 阅读 510

一.模板(html)

1.模板语法之变量**:**语法为 {{ }}

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

var_name 是一个变量名称,需要和views文件return第三个参数(字典)中的键一一对应。

views.py中的内容:

def index(request):

    # 变量里的变量名等于return中的值,return的键要也模板{{ 值 }}的一一对应

    s = "hello"  # 一个变量

    list1 = ['one', 2, "three"]  # 列表

    dict1 = {"name": "zero", "age": 18, "sex": "女"}  # 字典

    class Person(object):

        def __init__(self, name):

            self.name = name     # 类中的属性

        def eat(self):           # 类中的方法

            return "%s特别能吃" % self.name

    person_ming = Person("ming")  # 自定义类对象

    person_hu = Person("hu")

    person_xing = Person("xing")

    person_list = [person_ming, person_hu, person_xing]

    return render(request, "index.html", {

        "snum": s,

        "list": list1,

        "dict": dict1,

        "person_ming": person_ming,

        "person_list": person_list,

    })

templates下的index.html中body的内容:

哈哈哈哈


一个变量:{{ snum }}


一个列表:{{ list }}

列表中的元素获取第一个值:{{ list.0 }}

列表中的元素获取第二个值:{{ list.1 }}


一个字典:{{ dict }}

字典中的值:{{ dict.name }}

{% for key,val in dict.items %}

    

{{ key }}:{{ val }}

{% endfor %}


显示的是一个对象:{{ person\_ming }}

显示的是一个对象中的属性:{{ person\_ming.name }}

显示的是列表对象:{{ person\_list }}

显示列表对象中的第一个对象:{{ person\_list.0 }}

显示列表对象中的第二个对象的属性:{{ person\_list.0.name }}

显示对象中的方法:{{ person\_list.0.eat }}

{#注意对象中的方法调用在模板中不需要(),和属性相同即可被调用#}

注意:句点符也可以用来引用对象的方法

如:

字典:{{ dict.name.upper }}

2.模板语法之过滤器**:**语法 {{obj|filter__name:param}}

语法:{{obj|filter__name:param}}  #param可以有也可以没有

**(1)**default

如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。特别注意True也直接显示为True。

(2)length

语法:{{ value|length }}

返回值的长度。它对字符串和列表都起作用。

(3)filesizeformat

语法:{{ value|filesizeformat }}

value只能一个数值,其他类型的值无法读取默认:

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

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

(4)date

语法:{{ value|date:"Y-m-d" }}

根据给定的格式日期格式。

如果 now=datetime.datetime.now()

会输出:2019-07-04 的格式

还有别的时间格式输出:

{{ value|date }}

{{ value|date:"D d M Y" }}

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

(5)truncatechars

语法:{{ value|truncatechars:10 }}

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

参数:要截断的字符数

(6)safe

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

语法:{{ value|safe }}

以上的例子为下内容:

views.py内容为:

def model_filter(request):

    name1 = "hsz"

    str_length = "I love three things. The sun ,the moon and you. " \

                 "The sun for the day. The moon for the night and you forever."

    num = 12345

    value = "点击"

    import datetime

    now = datetime.datetime.now()

    return render(request,"filter.html",{

        # (1)default

        "name01": name1,

        "name02": False,

        "name03": '',

        "name04": True,

        # (2)length

        "str_lg": str_length,

        # (3)filesizeformat

        "str_fileszie": str_length,

        "num_filesize": num,

        # (4)date

        "now": now,

        # (5)truncatechars

        "str_truncate": str_length,

        # (6)safe

        "sf_value": value,

})

相应的filter.html的body内容为:

(1)default

{{ name01|default:"zero"}}

{{ name02|default:"zero"}}

{{ name03|default:"zero"}}

{{ name04|default:"zero"}}


(2)length

{{ str\_lg|length }}


(3)filesizeformat

{{ str\_fileszie|filesizeformat }}

{{ num\_filesize|filesizeformat }}


(4)datetime

{{ now|date }}

{{ now|date:"Y-m-d" }}

{{ now|date:"D d M Y" }}

{{ now|date:"D d M Y" }} {{ now|time:"H:i" }}


(5)truncatechars

截取50个字符

{{ str\_truncate|truncatechars:50 }}


(6)safe

{{ sf\_value|safe }}

3.模板语法之标签:语法为 {% tag  %}

标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

(1)for标签

**a.**遍历每一个元素

{% for pername in per_list %}

    

名字为:{{ pername}}

{% endfor %}


for的反向循环

{% for name in per_list reversed %}

    

倒叙的名字为:{{ name }}

{% endfor %}

b.遍历一个字典

遍历一个字典

一个人的信息:

{% for key,val in info_dict.items %}

    

{{ key }}:{{ val }}

{% endfor %}

注:循环序号可以通过{{forloop}}显示

例:

序号从1开始

{% for i in loop_list %}

    

{{ forloop.counter }}:{{ i}}

{% endfor %}

序号从1开始

{{ forloop.counter }}:{{ i.name }} === {{ i.eat }}

序号从0开始

{{ forloop.counter0 }}:{{ i.name }} === {{ i.eat }}

 倒序

{{ forloop.revcounter }}:{{ i.name }} === {{ i.eat }}

倒序,最后一个为0

{{ forloop.revcounter0 }}:{{ i.name }} === {{ i.eat }}

例:(forloop.first):

{% for i in loop_list %}

 {% if forloop.first %}

    {{i}}

 {% endif %}

{% endfor %}

例(forloop.last)2:

{% for i in loop_list %}

{% if forloop.last %}

    {{ i }} <--这是最后一个数

{% else %}

   {{ i }}|

{% endif %}

{% endfor %}

(2)for ... empty

for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

例:

{% for num in em_list %}

    

{{ num }}

{% empty %}

    

sorry,no num here

{% endfor %}

(3)if 标签

{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}

    

无效

{% elif num > 80 and num < 100 %}

    

优秀

{% else %}

    

凑活吧

{% endif %}

(4)with 标签

使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的。(就相当于把值暂时保存)

{{ per\_list.2 }}

{% with name=person_list.2 %}

    

{{ name }}

{% endwith %}

(5)csrf_token

提交数据的时候就会做安全机制,当你点击提交的时候会出现一个forbbiddon

的错误,就是用setting配置里的scrf做安全机制的,那么我们可以吧它给注释了,,,

或者在form表单下面添加一个{% csrf_token %},,,

这才是真正解决的办法,注释不是解决的办法

scrf\_token

    {% csrf_token %}

    

    

4.自定义标签和过滤器

(1)在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.。

(2)在app中创建templatetags模块(模块名只能是templatetags)。

(3)在templatetags里面创建任意 .py 文件。如:mytemtags.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# by hsz

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 = "" %(v1, v2)

return mark_safe(temp_html)

(4)在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

{% load my_tags %}

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

{% load xxx %}  

# num=12

{{ num|filter_multi:2 }} #24

{% simple_tag_multi 2 5 %}  

{% simple_tag_multi num 5 %}

注:参数不限,但不能放在if for语句中

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

自定义过滤器函数的参数只能两个,可以进行逻辑判断

自定义标签无参数限制,不能进行逻辑判断

{% if num|filter_multi:30 > 100 %}

    {{ num|filter_multi:30 }}

{% endif %}

二.静态文件配置

我们自己导入的一些包就叫做静态文件

1.在全局中(项目根目录)先创建一个static(名字随意)的包,

2.在包里面导入我们的bootstrap,还是jquery等

Django 学习 之 模板(html)与配置静态文件

3.然后在settings.py中加上一些配置

STATIC_URL = '/static/'

#这个配置就相当于下面配置的别名,如果这里的名字修改了就按照这里的名字去导入

STATICFILES_DIRS = [

    os.path.join(BASE_DIR,"mystatic"),

]

4.导入css,js,jquery

不要因为你创建的包名是mystatic而把下面路径中的static修改掉,Django中只有你在setting已经配置了,那么都是以static为名,就相当于别名。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这