django学习手记(八)-----文本

原创
小哥 3年前 (2022-11-16) 阅读数 7 #大杂烩

模板

一、定义模板

1、变量:

  • 视图传递给模板的数据,
  • 要遵守标识符规则
  • 语法:{ {var}} 计算以下var的值
  • 注意:如果使用的变量不存在,则插入的是空字符串
  • 在模板中使用点语法 <h1>{ {grade.gname}}</h1>
    字典查询
    属性或者方法
    数字
  • 在模板中调用对象的方法 <h1>{ {grade.getName}</h1> getName是models.py的函数名(不能传递参数)

在templates/firstapp中的index.html下面第九行添加 <h1>{ {num}}</h1>




    
    首页
    
    
    
          
	      
	


    

sunck is good man

{{num}}

在firstapp/views.py更改index函数

def index(request):
    return render(request,firstapp/index.html,{"num":10})

2、标签

1、语法{% tag %}
2、作用

  • 在输出中创建文本
  • 控制逻辑和循环

3、标签

  1. if 格式:
    {% if 表达式 %} 语句 {% endif %}
    {% if 表达式1 %} 语句1 {% else 表达式2 %} 语句2 {% endif %}
    {% if 表达式1 %} 语句1 {% elif 表达式2 %} 语句2 ... {% elif 表达式n %} 语句n {% endif %}
    {% if 表达式1 %} 语句1 {% elif 表达式2 %} 语句2 ... {% elif 表达式n %} 语句n {% else %} 语句 {% endif %}

    {%if num%}

    sunck is good man

    {%endif%}

  2. for 格式:
    {%for 变量 in 列表%} 语句 {%endfor%}
    {%for 变量 in 列表%} 语句1 {%empty%} 语句2 {%endfor%} 注意:列表为空或者列表不存在时执行语句2
    { {forloop.counter}} 表示当前是第几次循环,不是标签

    templates/firstapp/students.html

    <!DOCTYPE html>

    学生信息

    学生信息列表

      {%for stu in students%}
    • {{forloop.counter}}--{{stu.sname}}--{{stu.scontend}}--{{stu.sgrade}}
    • {%empty%}
    • 目前没有学生
    • {%endfor%}

    firstapp/views.py

    def students(request): list=Students.stuObj2.all() return render(request,firstapp/students.html,{"students":list})

    firstapp/urls.py

    path(students/, views.students),

  1. comment-----作用:注释多行
    {% comment %} 注释的内容 {% endcomment %}
  2. ifequal。ifnotequal 作用:判断是否相等或者不相等
    格式: {%ifequal 值1 值2 %} 语句 {% endifequal %} 如果值1等于值2,则执行语句
  3. include
    作用:加载模板并以标签内的参数渲染
    格式: {% include 模板目录‘ 参数1 参数2...%}
  4. url
    作用:反向解析
    格式: {% url namespace:name p1 p2%}
  5. csrf_token
    作用:用于跨站请求伪造保护的
    格式: {% csrf_token %}
  6. block/extends
    作用:用于模板的继承
  7. autoescape
    作用:用于HTML转义

3、过滤器

1、语法:{ { var|过滤器 }} 和 { { 变量|过滤器 }}一样, <h1>{ {str|upper}}</h1> ,字符串显示之前,修改成大写,str本身不变
2、作用:在变量被显示前修改它
3、

  1. lower <h1>{ {str|lower}}</h1>
  2. upper <h1>{ {str|upper}}</h1>
  3. 过滤器可以传递参数,参数用引号引起来
    join 格式: <h1>{ {列表|join:#}}</h1>
  4. 如果一个变量没有被提供,或者值为false或者为空,可以使用默认值
    default 格式: <h1>{ {var|default:good}}</h1>
    <h1>{ {test|default:没有}}</h1> test有值,返回值,没有值,返回default
  5. 根据给定格式转换日期为字符串
    date-----格式: { {dateval | date:y-m-d}} dateval–日期的变量
  6. HTML转义---- escape
  7. 加减乘除
    <h1>num={ {num | add :10}}</h1>
    <h1>num={ {num | add :-5}}</h1>
    标签
    <h1>{% widthratio num 1 5 %}</h1> ------> <!--num/1*5--> ----->num*5
    <h1>{% widthratio num 2 1 %}</h1> ------> <!--num/5*1--> ------>num/5

4、注释

1、单行注释
语法: {#注释的内容#}

多行注释
comment-----作用:注释多行
{% comment %} 注释的内容 {% endcomment %}

二、反向解析

第一部分

1、在templates/firstapp/index.html里面加一个 <a href="good/">链接</a> ,
<a href="/good/"> 表示从头开始
2、点击 链接 ,转到good的页面,需要firstapp/urls.py 配置路由 path(good/,views.good) ,
3、然后在firstapp/views.py中创建一个good视图
def good(request):
return render(request,firstapp/good.html)
4、在templates/firstapp中创建一个good.html,填写上内容 <h1>good</h1>

第二部分,传递一个数字123

1、在templates/firstapp/index.html里面加一个 <a href="good/123/">链接</a> ,
2、点击 链接 ,转到good的页面,需要firstapp/urls.py 配置路由 path(good/<int:id>/,views.good), ,
注意:路径里id是视图函数定义时的id
3、然后在firstapp/views.py中创建一个good视图
def good(request,id):
return render(request,firstapp/good.html,{"num":id})
4、在templates/firstapp中创建一个good.html,填写上内容 <h1>good--{ {num}}</h1>
注意:这里的num是将id赋给了num


第三部分,动态生成匹配的网址
(1)、project.urls.py
path(firstapp/, include((firstapp.urls,"myapp"),namespace=myapp)),
(2)、firstapp.urls.py
app_name=firstapp
path(good/<int:id>/,views.good,name="good"),
(3)、动态生成要匹配的网址
<a href="{%%20url%20myapp:good%201%20%}">链接2</a> 注意: ‘myapp:good’ 和1之间有空格,可以自定义是1还是别的
myapp拿的是(1)的地址,good拿的是(2)的good的地址,有几个 <int:id> ,后面跟几个参数,上面就一个,所以就跟一个参数值



三、模板继承

1、作用:模板继承可以减少页面内用的重复定义,实现页面的重用
2、block标签:

  • 在父模板中预留区域,子模版去填充
  • 语法: {% block 标签名%} {%enderblock 标签名%}

3、extends标签:

  • 继承模板,需要写在模板文件的第一行
  • 语法: {% extends 父模板路径%}

4、示例
定义父模板(基础模板)
定义子模板(主页模板)

基础模板1 一个block标签

{% block main%} {%endblock main%}

#base.html



    
    首页
    
    
    
          
	      
	
     


    
    
{% block main%} {%endblock main%}

主页模板1

#templates/firstapp/main.html,继承base.html,只需要填充{% block main%}  {%endblock main%},中间部分

{%extends firstapp/base.html%}

{% block main %}
    

sunck is good main

{% endblock main%} #firstapp/urls.py path(main/,views.main), #firstapp/views.py def main (request): return render(request,firstapp/main.html)

http://localhost:8000/firstapp/main/

主页模板2

#templates/firstapp/detail.html,继承base.html,只需要填充{% block main%}  {%endblock main%},中间部分
{%extends firstapp/base.html%}
{% block main %}
    

sunck man

{% endblock main%} #firstapp/urls.py path(detail/,views.detail), #firstapp/views.py def detail(request): return render(request,firstapp/detail.html)

http://localhost:8000/firstapp/detail/

基础模板2 两个block标签

{% block main%} {%endblock main%}
<hr/>
{% block main2%} {%endblock main2%}

#templates/firstapp/main.html



    
    首页
    
    
    
          
	      
	
     


    
    
{% block main%} {%endblock main%}
% block main2%} {%endblock main2%}

主页模板

#templates/firstapp/main.html,继承base.html,只需要填充{% block main%}  {%endblock main%},中间部分,
#{% block main2 %}   {% endblock main2%}

{%extends firstapp/base.html%}

{% block main %}
    

sunck is good main

{% endblock main%} {% block main2 %}

good man

{% endblock main2%}

http://localhost:8000/firstapp/main/

四、HTML转义

1、问题

#firstapp/views.py
def index(request):
    return render(request,firstapp/index.html,{"num":10,"code":"

sunck is a very good man

"}) #在templates/firstapp/index.html里面添加下面代码 {{code}}

将接受到的code当成普通字符串渲染

将接受到的字符串当成HTML渲染,解决一个

#在templates/firstapp/index.html里面添加下面代码
{{code}}#转成字符串
{{code|escape}}#----->转成字符串
{{code|safe}}#字符串当成HTML渲染

localhost:8000/firstapp/index/

将接受到的字符串当成HTML渲染,解决一堆

#在templates/firstapp/index.html里面添加下面代码
{% autoescape off %}#off 关闭自动转义,当HTML渲染
{{code}}
{% endautoescape %}

{% autoescape on %}#on 打开自动转义,还是字符串
{{code}}
{% endautoescape %}

五、CSRF

  • 跨站请求伪造: 某些恶意网站包含链接,表单,按钮,JS,利用登录的用户在浏览器中认证,从而攻击服务
  • 防止CSRF:在setting.py文件中的 MIDDLEWARE , #django.middleware.csrf.CsrfViewMiddleware,
  • {% csrf_token %} ,加一个验证

六、验证码

1、作用:

  • 在用户注册,登录页面的时候使用,为了防止暴力请求,减轻服务器的压力
  • 也是防止csrf一种方式

2、

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除