"""
******模版****** --定义模版--
**变量**
视图传递给模版的数据
注意1:要遵守标识符规则
语法:{{var(即变量)}}
如果使用的变量不存在,则插入的是空字符串
在模版中使用点的语法,
1.先当字典查询来处理
2.属性或者方法
3.数字索引
举例:
VIEWS中定义如下:
def index11(request):
student = Students.objects.get(pk=1)
return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.sname }}</h1> 在模版中调用对象的方法:
1.在models中定义一个方法
def getName(self):
return self.sname
2.views中定义如下:
def index11(request):
student = Students.objects.get(pk=1)
return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.getName }}</h1>
注意:模版不能传递附加的参数
在models中定义一个方法如下,以下这样的方式是不可以的
def getName(self,str):
return self.sname+str **标签**
语法:{% tag %}
作用:
1.在输出中创建文本
2.控制逻辑和循环
if
格式1:
{% if 表达式 %}
语句
{% endif %}
格式2:
{% if 表达式1 %}
语句1
{% else %}
语句2
{% endif %}
格式3:
{% if 表达式1 %}
语句1
{% elif 表达式2%}
语句n
{% else %} #这个可有可无
语句e
{% endif %}
示例:
{% if num %}
<h1>hello world</h1>
{% endif %} for
格式1:
{% for 变量 in 列表 %}
语句1
{% empty %} #这个可有可无,这个是列表为空或者列表不存在,执行语句2
语句2
{% endfor %} 格式2:
{% for 变量 in 列表 %}
语句1
{% endfor %} 格式3:
{{forloop.counter}} #表示当前是第几循环
示例1:
{% for line in studdd %}
<li>{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% empty %}
<li>目前没有学生</li>
{% endfor %}
示例2:
{% for line in stud %}
{% if forloop.counter|divisibleby:2 %}
<li style="color:red">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% else %}
<li style="color:blue">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% endif %}
{% empty %}
<li>目前没有学生</li>
{% endfor %} comment
作用:注释多行,不紧可以注释标签,也可以注意变量
格式:
{% comment%}
<h1>学生</h1>
{{stu.student}}
{%endcomment%}
单行注释用: {# 注释内容 #} ifequal/ifnotequal
作用:判断是否相等或者不相等
格式:
{% ifequal 值1 值2%} #如果值1与值2相等就执行下面的语句,不相等就不执行
语句
{% endifequal %}
示例:
{% ifequal 'ok' 'ok' %}
<h1>学生要加油</h1>
{% endifequal %} include
作用:加载模版并以标签内容的参数渲染
格式:{% include '模版目录' 参数1 参数2 %} url
作用:反向解析
格式:{% url 'namespacename' p1 p2 %}
主url
urlpatterns = [
# path('admin/', admin.site.urls),
url(r'^',include('users.urls',namespace='app')),
]
次url
app_name ='app3'
urlpatterns = [
url(r'^food/(\d+)/(\d+)/$', views.good,name='good'),
]
视图views
def good(request,id,id3):
return render(request,'users/good.html',{'num':id,'num3':id3})
html中
<a href="{% url 'app:good' 5 3%}">跳转</a>
跳转到good.html
<h1>{{ num }}</h1>
<h1>{{ num3 }}</h1> csrf_token
作用:用于跨站请求伪造保护
某些网站包含链接、表单、按钮、JS会利用我们登陆的用户在浏览器中认证,从而攻击服务
防止csrf有两种方法
第一种:
1.在setting中MIDDLEWARE里加上'django.middleware.csrf.CsrfViewMiddleware',
2.在表单中{% csrf_token %}
第二种:
验证码:在用户注册,登陆页面时候使用,为了防止暴力请求,减轻服务器的压力,防止CRSF一种方式!
1.安装pillow模块
2.在views中配置一个def ,如下代码,用于生成图片验证码的函数
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse
def verifycode(request):
# 引入绘图模块
from PIL import Image,ImageDraw,ImageFont
#引入随机函数模块
import random
#定义变量,用于画面的背景色,宽,高
bgcolor = (random.randrange(20,100),random.randrange(20,100),random.randrange(20,100))
width = 100
height = 50
#创建画面对象
im = Image.new('RGB',(width,height),bgcolor)
#创建画笔对象
draw = ImageDraw.Draw(im)
#调用画笔的point()函数绘制噪点
for i in range(0,100):
#这个是画点
xy = (random.randrange(0,width),random.randrange(0,height))
#这个是颜色的填充
fill = (random.randrange(0,255),255,random.randrange(0,255))
draw.point(xy,fill=fill)
#定义验证码的备用值
str = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
#随机选取4个值作为验证码
rand_str = ''
for i in range(0,4):
rand_str += str[random.randrange(0,len(str))]
#构造字体对象 把C盘的字体文件放到其它盘,因为C盘字体文件路径不好找
font = ImageFont.truetype("E:\simsunb.ttf", 36)
fontcolor1 = (255, random.randrange(0,255), random.randrange(0,255))
fontcolor2 = (255, random.randrange(0,255), random.randrange(0,255))
fontcolor3 = (255, random.randrange(0,255), random.randrange(0,255))
fontcolor4 = (255, random.randrange(0,255), random.randrange(0,255))
#绘制4个字
draw.text((5,2), rand_str[0], font=font, fill=fontcolor1)
draw.text((25,2), rand_str[1], font=font, fill=fontcolor2)
draw.text((50,2), rand_str[2], font=font, fill=fontcolor3)
draw.text((75,2), rand_str[3], font=font, fill=fontcolor4)
#释放画笔
del draw
# request.session['verifycode'] = rand_str
#内存文件操作
import io
buf = io.BytesIO()
#将图片保存在内存中,文件类型为png
im.save(buf,'png')
#将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getvalue(),'image/png')
#备注:
# code1 = request.session['verify'] 【登录获取图片上的验证码】
#code2 = request.POST.get('verifycode') 【获取登录表单上输入的验证码】
3.配置url
url(r'^verifycode/$',views.verifycode),
url(r'^verifycodefile/$',views.verifycodefile),
url(r'^verifycodecheck/$',views.verifycodecheck),
4.创建html
<body>
<form action="/verifycodecheck/" method="post">
{% csrf_token %}
<input type="text" name="yanzheng" />
<img src="/verifycode/">
<input type="submit" value="登陆" />
<span>{{ flag }}</span>
</form>
</body>
5.再次配置views
from django.shortcuts import redirect
def verifycodefile(request):
ff = request.session.get('shibai',True)
str = ''
request.session.clear()
if ff == False:
str = "验证码输入错误,请重新输入"
return render(request,'users/verifycodefile.html',{'flag':str}) def verifycodecheck(request):
code1 = request.POST.get('yanzheng').upper()
code2 = request.session['verifycode'].upper()
print(code1,code2)
if code1 == code2:
request.session.clear()
return render(request,'users/succese.html')
else:
request.session['shibai']= False
return redirect('/verifycodefile/') 模版继承
作用:模版继承可以减少页面内容的重复定义,实现页面的重用
block标签 在父模版中预留区域,子模版去填充
语法:
{% block 标签名 %}
{% endblock 标签名 %}
父模版:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#header{
width:100%;
height: 100px;
background-color:red;
}
#footer{
width:100%;
height: 100px;
background-color:blue;
}
</style>
</head>
<body>
<div id = "header">header</div>
<div id = "main">
{% block main%}
{% endblock main %}
<hr/>
{% block main2%}
{% endblock main2 %}
</div>
<div id = "footer">footer</div>
</body>
</html> extends标签 继承模版,需要写在模版文件的第一行
语法:
{% extends 'users/base.html' %}
{% block main %}
<h1>ok,my</h1>
{% endblock main %}
{% block main2 %}
<h1>suck,is kaige</h1>
{% endblock main2 %} HTML转义
举例:
return render(request,'users/index11.html',{'code':'<h1>suck is hao de </h1>'}) <h1>{{ code|safe }}</h1> #转义一个
#下面是同时转义多个
<h1>
{% autoescape off %}
{{ code }}
{% endautoescape %} **过滤器**
语法:{{var(即变量)|过滤器}}
作用:再变量被显示前修改它
过滤器的种类:
一、lower 小写
二、upper 大写 例:<h1>{{ str|upper }}</h1>
三、过滤器可以传递参数,参数用引号引起来:
1.join 格式 列表|join:'#' 列表|join:'连接的东西'
例:<h1>{{ list|join:'#' }}</h1>
四、如果一个变量没有被提供,或者值为False,空,可以使用默认值
1.default
格式:{{var|default:'good'}}
例:<h1>{{ lis4t|default:'godd' }}</h1>
五、根据给定的格式转换日期为字符串
1.date
格式:{{ dateval|date:'y-m-d'}}
六、HTML转义
1.escage
七、加减乘除
<h1>{{ num|add:10 }}</h1>
<h1>{{ num|add:-5 }}</h1>
<!--num/1*5(num除以1乘5)后面必须带两个值,格式规定-->
<h1>{% widthratio num 1 5%}</h1>
<!--num/5*1(num除以5乘1)-->
<h1>{% widthratio num 5 1%}</h1> 标签:include
加载模板(带参数渲染)
格式:{% include '模板位置' with 参数1 参数2 参数3..... %}
举例:{% include 'index_context.html'%} """

django 模版-标签-视图-csrf-token-模版继承-HTML过滤器的更多相关文章

  1. 使用Ajax (put delete ) django原生CBV 出现csrf token解决办法

    原因 django原生CBV中对于 Ajax put 或 delete 请求进行封装时,会把请求数据放在 request.body里, 所以获取不到csrf token 方式一: 关闭csrf 中间件 ...

  2. python Django 学习笔记(三)—— 模版的使用

    模版基本介绍 模板是一个文本,用于分离文档的表现形式和内容. 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签). 模板通常用于产生HTML,但是Django的模板也能产生任何 ...

  3. vue+django前后端分析解决csrf token问题

    vue-resource post数据 参考:https://www.cnblogs.com/linxizhifeng/p/8995077.html 阅读django CsrfViewMiddlewa ...

  4. Django后台post请求中的csrf token

    使用Requests库操作自己的Django站点,post登陆admin页面返回403,serverlog显示csrf token not set. csrf token是get登陆页面时服务器放在c ...

  5. django rest framework csrf failed csrf token missing or incorrect

    django rest framework csrf failed csrf token missing or incorrect REST_FRAMEWORK = { 'DEFAULT_AUTHEN ...

  6. django CSRF token missing or incorrect

    django 异步请求时提示403 按照一般情况权限问题,python文件没有问题,仔细看了下response里有一句 CSRF token missing or incorrect.这个肯定是因为安 ...

  7. thinkphp禁止模版标签解析

    场景: 页面中某些样式或者js中含有tp定义的模版标签,如果被tp当成模版标签解析,就会解析异常. tp中提供了<literal></literal>标签用于禁止标签内部的代码 ...

  8. WordPress主题制作教程6:常用模版标签

    在wordpress中,模板标签指一些字段,比如标题,内容,作者,发布日期,评论数等等,获取静态值和循环里面经常使用. 输出模板标签一般有两种方式:the_yourtag() 输出标签值和get_th ...

  9. smarty模版使用php标签,如何获取模版变量

    smarty模版使用php标签,如何获取模版变量 in: 后端程序 已经assign一个模版变量$assign,由于要做特殊的循环输出,使用for循环,因此使用到了php标签,但是php语句和模版语句 ...

随机推荐

  1. 简略图解:输入 url 到出现页面,浏览器做了什么?

    应该有很多前端开发人员都思考过这么一个问题:从输入 URL 到页面加载完成,中间都做发生了什么? 这个问题涉及的面非常广,每个涉及的点又很深入.从触屏/键盘如何到 CPU?CPU 如何到系统内核?如何 ...

  2. 第一次上传代码到gitee

    初始化 git init 添加文件到本地仓库 git add . 提交文件到本地仓库 git remote add origin 仓库地址 拉去远程仓库代码 git pull origin maste ...

  3. SpringCache(redis)

    pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  4. Rabbit-用户上线接收消息

    application-dev.yml spring: rabbitmq: username: admin password: admin host: 192.168.0.45 port: 5672 ...

  5. Nodejs koa2读取服务器图片返回给前端直接展示

    参考:https://blog.csdn.net/lihefei_coder/article/details/105435358 const fs = require('fs'); const pat ...

  6. wpf 获得exe的运行路径

    System.Reflection.Assembly.GetEntryAssembly().Location

  7. Nacos 服务注册的原理

    Nacos 服务注册需要具备的能力: 服务提供者把自己的协议地址注册到Nacos server 服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称) Nacos Serve ...

  8. (2)hadoop之-----配置免密码登录

    ssh-keygen -t rsa 然后一路回车 在家目录下会生成 .ssh 目录           ls -la   查看 进入   .ssh            cd .ssh cp ~/.s ...

  9. playwright-python 元素定位、frame处理(一)

    浏览器.Browser contexts.frame Playwright 可以同时启动多个浏览器(chromium.Firefox.webkit),每个浏览器可以启动多个page(在Playwrig ...

  10. 关于Ubuntu18.04上Python版本管理

    时间: 2019-11-11 整理: pangyuaner 标题:树梅派上多版本python及pip安装使用管理指南 地址:https://blog.csdn.net/zbgjhy88/article ...