django 过滤器,标签
过滤器:
<p>{{ date|date:"Y-m-d" }}</p>
{#2018-05-28,date是当前时间#}
<p>{{ l|length }}</p>
{# 4 l=[1,2,3,4]#}
<p>{{ size|filesizeformat }}</p>
{#9.8M size=10240000#}
<p>{{ sentence|slice:"2:-1" }}</p>
{# llo worl sentence="hello world" 切分#}
<p>{{ flase|default:'nothing' }}</p>
{# nothing 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值#}
<p>{{ value|truncatechars:5 }}</p>
{# zh... value='zhouyiming' #}
“Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,
比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,
如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以
通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义”
{{ test_content|safe}}
模版中的标签:
for标签
{% for k,j in dic1.items %}
<p>{{ k }}:{{ j }}</p>
<p>{{ forloop.counter }}</p>
{% endfor %}
{# a:zyma 1 b:zymb 2 c:zymc 3 dic1={"a":"zyma","b":"zymb","c":"zymc"}#}
!!!循环的序号可以通过forloop来控制,下面是控制的参数。 forloop.counter The current iteration of the loop (1-indexed)
forloop.counter0 The current iteration of the loop (0-indexed)
forloop.revcounter The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed)
forloop.first True if this is the first time through the loop
forloop.last True if this is the last time through the loop
for ... empty
for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if 标签
{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
复制代码
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
with标签
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token
用户crsf中间件,在使用post请求的时候,django的crsf中间件会进行验证,会报403错误。加上 csrf_token进行跨站请求伪造保护
自定义标签和过滤器
1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
2.在app中创建templatetags模块(模块名只能是templatetags)
3.创建任意 .py 文件,如:my_tags.py
filter是过滤器,simple_tag是标签。
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
<br>
@register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2
<br>
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result) 4.在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
在html的开头添加
{% load my_tags %}
5.使用simple_tag和filter(如何调用)
-------------------------------.html
{% load xxx %} # num=12
{{ num|filter_multi:2 }} # {{ num|filter_multi:"[22,333,4444]" }} {% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %} 6.区别
注意:filter可以用在if等语句(控制语句)后,simple_tag不可以
filter最多能传两个参数,simple_tag不限。
include标签
在html中写入标签{% include 'include.html' %} 相当于插入的作用。
include.html
<div>
<p style="color: darkgrey">hello world</p>
<p style="background-color: #2aabd2">hi yuan</p>
</div>
inclusion_tag标签
在做个人界面的时候,会有不变的地方比如博客园的分类和标签之类的,但是这样的地方还需要数据来渲染。
有两种方法解决:
第一种利用模版继承,将你需要的数据写入一个函数内,返回一个字典,需要的时候调用。
第二种使用标签inclusion_tag来实现,相当于将你想要不变的地方,做成一个组件的形式,而且保证数据和html在一块。即取即用。
根据上面的自定义标签来创建templatetags文件夹,创建一个py的文件(你自己的),这里是my_tags.py,然后创建你的menu.html文件,样式写再里面
from django import template
from django.db.models import Count
from blogs import models
register=template.Library() #实例化 @register.inclusion_tag("menu.html") #“menu.html”是关联html文件,
def get_menu(username):
user=models.UserInfo.objects.filter(username=username).first()
print(type(user))
print(user)
blog=user.blog
category = models.Category.objects.filter(blog=blog).annotate(count=Count("article")).values_list('title', "count")
tag = models.Tag.objects.filter(blog=blog).annotate(count=Count("article")).values_list('title', 'count')
date_list = models.Article.objects.filter(user=user).extra(
select={"archive_date": "strftime('%%Y-%%m',create_time)"}).values('archive_date').annotate(
count=Count("nid")).values_list("archive_date", 'count') return {"username":username,'category':category,"tag":tag,'date_list':date_list}
menu.html文件
<div>
<div class="panel panel-warning">
<div class="panel-heading">分类</div>
<div class="panel-body">
{% for foo in category %}
<div><a href="/blogs/{{ username }}/cate/{{ foo.0 }}/">{{ foo.0 }}</a>({{ foo.1 }})</div> {% endfor %} </div>
</div> {#标签 #}
<div class="panel panel-success">
<div class="panel-heading">标签</div>
<div class="panel-body">
{% for foo in tag %}
<div><a href="/blogs/{{ username }}/tag/{{ foo.0 }}/">{{ foo.0 }}</a>({{ foo.1 }})</div> {% endfor %} </div> </div> {# 日期归档 #}
<div class="panel panel-success">
<div class="panel-heading">日期</div>
<div class="panel-body">
{% for foo in date_list %}
<div><a href="/blogs/{{ username }}/date/{{ foo.0 }}/">{{ foo.0 }}</a>({{ foo.1 }})</div> {% endfor %} </div> </div> </div>
主html文件:
第一行加入:{% load my_tags %}
再在你想要添加的位置,{% get_menu username %} ,get_menu是my_tags.py中的函数,username是你传进去的参数。
执行顺序是先子啊模版渲染前执行这个函数,并传入参数。下方结果

xxx
django 过滤器,标签的更多相关文章
- Django 自定义标签与过滤器报错 No module named 'templatetags'
Django 自定义标签与过滤器报错 按照网上的教程如果想使用自定义的标签与过滤器就得往settings.py中添加下列数据 TEMPLATES = [ { 'BACKEND': 'django.te ...
- Django过滤器列表
Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...
- django 自定义标签和过滤器
django 自定义标签和过滤器 Django支持自定义标签和过滤器.起初还不太重视它这项功能,但最近试了试自定义标签.发现django这个功能实在是太爽了. 首先在你项目的一个app中建立一个pyt ...
- Django 模板标签[转]
Django 模板标签if/else 标签 基本语法格式如下: {% if condition %} ... display{% endif %} 或者: {% if condition1 % ...
- django -过滤器的使用
前情提要: 最近工作中用到django 中的 自定制过滤器的内容, 再此 复习一波过滤器和自定制 过滤器的内容 自定制过滤器 1.在settings中的INSTALLED_APPS配置当前app ...
- 解决AngularJS和Django模板标签冲突问题
原地址 Django和AngularJS在模板中使用同样的符号来引用变量,例如 {{variable_name}}. 有两种解决办法,各有利弊.一个修改AngularJS模板语法,另一个使用Djang ...
- 转:django模板标签{% for %}的使用(含forloop用法)
django模板标签{% for %}的使用(含forloop用法) {% %}虽然这个是写在html中,但是这里边写的是服务端代码 在django模板标签中,{% for %} 标签用于迭代序列 ...
- Django Context对象 + 过滤器 + 标签
玩一玩上下文(context)对象 多数时间,你可以通过传递一个完全填充(full populated)的字典给 Context() 来初始化 上下文(Context) . 但是初始化以后,你也可以从 ...
- Django 模板中 变量 过滤器 标签 的使用方法
一.变量 1.变量的形式是:{{variable}}, 当模板引擎碰到变量的时候,引擎使用变量的值代替变量. 2.使用dot(.)能够访问变量的属性 3.当模板引擎碰到dot的 ...
随机推荐
- Python基础03_pycharm
pycharm的安装还是很简单的,一路next. 看起来Jet Brains 家的产品长相都差不多啊. 主要是create new project时,路径和解释器的选择,我电脑上有2.7和3.6 所以 ...
- phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接 解决办法
phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接.您应该检查配置文件中的主机.用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致. 原因有可能是因为修改了m ...
- brand new start
做了约两年半的安全,留下了约五十多篇笔记,从电脑搬过来,免的丢了
- 基于SPA的网页授权流程(微信OAuth2)
先说传统MVC网站的网页授权流程. 1.用户发起了某个需要登录执行的操作 2.收集AppId等信息重定向到微信服务器 3.微信服务器回调到网站某个Controller的Action 4.在此Actio ...
- cocos2dx开发之util类&方法——取当前系统时间
返回time_t,即从1970年1月1日至今的秒数 time_t getSysTime(){ time_t currentTime = time(NULL); return currentTime; ...
- linux下设置mysql5.7数据库远程访问
1.在网上看了很多关于设置远程访问的方式,根本就不起作用,后来在网上看到有一篇文章终于解决了我的问题,在配置文件中 /etc/mysql/my.cnf : 2.编辑 vi /etc/mysql/mys ...
- MongoDB基础知识(二)
一.基本概念 1:文档(document)是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行 2:集合(collection)可以看做是一个拥有动态模式(dynamic schem ...
- Day 10 函数的形参,实参
今日内容 '''实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表达式或三者的组合*****形参:定义函数,在括号内声明的变量名,用来接受外界传来的值''''''注:形参随着函数的调用 ...
- Day 05 可变不可变、数据类型内置方法
1.可变类型:值改变,但是id不变,证明就是改变原值,是可变类型 2.不可变类型:值改变,但是id也跟着改变,证明是产生新的值,是不可变类型 数字类型 一.整型int 1.用途:记录年龄.等级.数量 ...
- requests库(爬虫)
北京理工大学嵩天老师的课程:http://www.icourse163.org/course/BIT-1001870001 官方文档:http://docs.python-requests.org/e ...