Django T 部分总结

T部分指的就是Django项目下的templates文件夹
是Django自带的模板系统 (Template System)
它的作用是将python代码和HTML文件解耦合,如此也便于维护
templates文件夹文件间存放HTML文件
Django的setting.py已经默认将路径添加,所以在全局都可以调用的到

其中HTML文件,也就是模版的组成是:
HTML代码+逻辑控制代码

这里主要讲逻辑控制代码

一, 大变量(使用双大括号来引用变量):

语法格式: {{var_name}}

这里配合python代码中render类方法使用
插一个

对 Django render方法底层实现的总结

首先看怎么用:

return render (request,html文件的字符串形式,context对象)

python manange.py shell (进入该django项目的环境)
from django.template import Context, Template
t = Template(‘My name is {{ name }}.’)
c = Context({‘name’: ‘Stephane’})
t.render©
‘My name is Stephane.’

上面是具体实现过程:
可以看出来,Template和Context是两个类,由他们实例化出两个对象,Template类对象调用render方法,传入Context实例化对象做参数

所以render有几个用处:

1.render会把第二个参数(html文件的字符串形式)实例化为Template对象,把第三个参数实例化为Context对象,然后Template类对象调用render方法,传入Context实例化对象做参数,得到一个结果

2render把处理好的结果会交给Httpresponse返回给客户端,所以要有一个request参数

作者:月守护
来源:优快云
原文:https://blog.youkuaiyun.com/csdniter/article/details/93391220
版权声明:本文为博主原创文章,转载请附上博文链接!

二, 深度变量的查找(万能的句点号)

<h1>hello {{ l.1 }}</h1>

{#深度查询,用万能的句点号. 列表,元组,字典,类可以#}

三,变量的过滤器(filter)的使用

语法格式: {{obj|filter:param}}

Django 自带的一些过滤器

1 add : 给变量加上相应的值

2 addslashes : 给变量中的引号前加上斜线

3 capfirst : 首字母大写

4 cut : 从字符串中移除指定的字符

5 date : 格式化日期字符串

6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值

7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值

此外,还可以自定制fliter过滤器方法,后面和自定制标签一起讲到

四,标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

语法格式:{% tags %}

1.------{% if %} 的使用

{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容

注:里面可以嵌套的条件判断和python语法一样,多了一个对应endif

后面的tag都参照Python语法,不再赘述

2.------{% for %}的使用

{% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容

3.------{%csrf_token%}:csrf_token标签

用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效

其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

注:这个问题目前只在form表单post提交方式里出现,
另一种解决方法是注释掉setting.py文件的相关功能部分
’django.middleware.csrf.CsrfViewMiddleware’
4.------{% url %}: 引用路由配置的地址
form表单中action属性相关,同源情况下用别名的一种方式
eg:<form action="{% url “注册” %}" method=“post”>
5.------{% with %}:用更简单的变量名替代复杂的变量名

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
6.------{% verbatim %}: 禁止render

{% verbatim %}
         {{ hello }}
{% endverbatim %}

五, 自定义filter和simple_tag

------a、在app中创建templatetags模块(必须的)

------b、创建任意 .py 文件,如:my_tags.py

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

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


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


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


@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

------c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

------d、使用simple_tag和filter(如何调用)

-------------------------------.html
{% load xxx %}   #首行
    
    
    
    
 # num=12
{{ num|filter_multi:2 }} #24

{{ num|filter_multi:"[22,333,4444]" }}


{% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}

------e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

注意区别:1.自定制filiter只能传入第二个参数,默认第一个是大变量
自定制tag参数不限
两者都可以传入大变量,注意格式,不需再加{{ }}
2.filter可以用在if等语句后,simple_tag不可以

六,extend模板继承

目的是为了代码复用
首先在base.html要被修改的部分加上钩子

{% block 钩子名 %}
要修改部分
{% endblock %}

理论上钩子越多越好

其他html文件(子模板)要用base.html(父模板)代码
要首先继承

{% extends "base.html" %}

然后在修改钩子部分
{% block 钩子名 %}
修改后部分
{% endblock %}

这些都是用钩子名来对应的,所以不允许在同一个模板中定义多个同名的 {% block %}

还可以把父类钩子里的内容拿过来加以改进

{% block 钩子名 %}
	{{block.super}}
	修改后部分
{% endblock %}

再加一个把html,css或者是js文件添加到html文件

html:
{% include “test.html” %}

引入css方式:

<link rel="stylesheet" href=" css文件路径">

注:在html的head部分
引入JS方式:

<script src="js文件路径"></script>

在body部分
文件路劲要保证Django可以找得到,一般是放在"static’文件夹中
所以这里要在setting.py中添加路径

STATICFILES_DIRS=(
    os.path.join(BASEDIRS,"static")
)

并且Django会自动给一个别名:

STATIC_URL = '/static/'

————————————分隔线—————————————————
补充一个Html格式的字符串的两种渲染方式:
eg:

#后台
def Text(request)
    text="<input type="text">"
    return render(request,"xxx.html",{"text":text})
{{ text }}

浏览器显示效果:"<input type="text" />"
要想正常渲染,有两种方式:
一,后台处理:

from django.utils.safestring import mark_safe
def Text(request)
    text="<input type="text">"
    text=mark_safe(text)
    return render(request,"xxx.html",{"text":text})

二,前端处理

{{ text | safe }}

两种方式处理之后都都正常显示输入框

强行不渲染参见Tag使用第六条

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值