探索Django utils

探索Django utils

Posted November 16, 2018

Django utils 提供了很多实用的功能.

Crypto

Module: django.utils.crypto

get_random_string

获取随机字符串函数, 默认是返回长度为12的随机字符串。 可以通过参数传递长度.

Python

from django.utils.crypto import get_random_string

get_random_string()

Python

output

'5QxAxqyhsyJM'

你可以传递参数, 获取指定长度的字符串

Python

get_random_string(50)

Python

output

'lrWYnyxhnXpwmjHDzmdgTFaIi1j73cKD5fPDOPwuVBmmKxITYF'

也可以指定字符串的选值范围

Python

get_random_string(12, '0123456789')

Python

output

'805379737758'

Dates

Module: django.utils.dates

常用日期的集合, 日期的人性化显示.

WEEKDAYS

Python

from django.utils.dates import WEEKDAYS

Python

WEEKDAYS = {
    0: _('Monday'), 1: _('Tuesday'), 2: _('Wednesday'), 3: _('Thursday'), 4: _('Friday'),
    5: _('Saturday'), 6: _('Sunday')
}

WEEKDAYS_ABBR

Python

from django.utils.dates import WEEKDAYS_ABBR

Python

WEEKDAYS_ABBR = {
    0: _('Mon'), 1: _('Tue'), 2: _('Wed'), 3: _('Thu'), 4: _('Fri'),
    5: _('Sat'), 6: _('Sun')
}

MONTHS

Python

from django.utils.dates import MONTHS

Python

MONTHS = {
    1: _('January'), 2: _('February'), 3: _('March'), 4: _('April'), 5: _('May'), 6: _('June'),
    7: _('July'), 8: _('August'), 9: _('September'), 10: _('October'), 11: _('November'),
    12: _('December')
}

DateFormat

Module: django.utils.dateformat

一个很棒的日期格式化模块

format

Python

from django.utils.dateformat import format
from django.utils import timezone

now = timezone.now()    # datetime.datetime(2018, 11, 16, 6, 48, 41, 351928, tzinfo=<UTC>)
format(now, 'd M Y')

Python

output

u'16 Nov 2018'

日期和时间一起

Python

format(now, 'd/m/Y H:i')

Python

output

u'16/11/2018 06:48'

DateParse

Module: django.utils.dateparse

将格式化后的字符串转为 date/time/datetime 对象. 如果字符串格式正确, 但表示无效时间将会返回 None.

parse_date

Python

from django.utils.dateparse import parse_date

parse_date('2018-11-16')

Python

output

datetime.date(2018, 11, 16)

parse_time

Python

from django.utils.dateparse import parse_time

parse_time('14:54:02')

Python

output

datetime.time(14, 54, 2)

parse_datetime

Python

from django.utils.dateparse import parse_datetime

parse_datetime('2018-11-16 14:54:02')

Python

output

datetime.datetime(2018, 11, 16, 14, 54, 2)

HTML

Module: django.utils.html

urlize

将文本中的网址转换为<a>标签

Python

from django.utils.html import urlize

urlize('You guys should visit this website www.google.com')
print urlize('Please visit:  https://jackeygao.io')

Python

output

'You guys should visit this website <a href="http://www.google.com">www.google.com</a>'
Please visit:  <a href="https://jackeygao.io">https://jackeygao.io</a>

他也适用于email地址

Python

urlize('Send me a message to [email protected]')

Python

output

'Send me a message to <a href="mailto:[email protected]">[email protected]</a>'

你也可以修剪链接显示部分长度, 不足处以'...'替代

Python

urlize('Please visit https://jackeygao.io/words/django-exploring-utils.html', 24)

Python

output

Please visit <a href="https://jackeygao.io/words/django-exploring-utils.html">https://jackeygao.io/...</a>

escape

对html 特殊字符编码

Python

from django.utils.html import escape

escape("<strong style='font-size: 12px'>escaped html</strong>")

Python

output

'&lt;strong style=&#39;font-size: 12px&#39;&gt;escaped html&lt;/strong&gt;'

这将导致已转义的字符串再次被转义

Python

escaped_html = escape("<strong>escaped html</strong>")
# '&lt;strong&gt;escaped html&lt;/strong&gt;'

escape(escaped_html)
# '&amp;lt;strong&amp;gt;escaped html&amp;lt;/strong&amp;gt;'

如果不想这样, 请改用conditional_escape()

conditional_escape

Python

escaped_html = conditional_escape("<strong>escaped html</strong>")
# '&lt;strong&gt;escaped html&lt;/strong&gt;'

conditional_escape(escaped_html)
# '&lt;strong&gt;escaped html&lt;/strong&gt;'

format_html

此函数类似格式化字符串(str.format()), 因为安全的原因推荐使用format_html.

Python

from django.utils.html import format_html

format_html('<div class="alert {}">{}</>', 'warning', 'Watch out!')

Python

output

'<div class="alert warning">Watch out!</>'

安全的格式化 HTML 代码.

Python

format_html('<div class="alert {}">{}</>', '<script>alert(1);</script>', 'Watch out!')

Python

output

'<div class="alert &lt;script&gt;alert(1);&lt;/script&gt;">Watch out!</>'

format_html_join

适用于快速用相同的方式格式化一组列表

Python

format_html_join('\n', '<p>{}</p>', ['a', 'b', 'c'])

Python

output

<p>a</p>\n<p>b</p>\n<p>c</p>

另外一个例子

Python

data = [
    ['success', 'Success message'],
    ['warning', 'Watch out!'],
    ['danger', 'Danger!!'],
]

format_html_join('\n', '<div class="alert {0}">{1}</div>', data)

Python

output

<div class="alert success">Success message</div>\n
<div class="alert warning">Watch out!</div>\n
<div class="alert danger">Danger!!</div>

和表格一起使用, 当然也可以和ul li一起使用.

Python

format_html_join('\n', '<tr><td>{0}</td><td>{1}</td></tr>', ((u.first_name, u.last_name)
                                                            for u in users))

Python

output

<tr><td>Vitor</td><td>Freitas</td></tr>\n
<tr><td>John</td><td>Duo</td></tr>\n
<tr><td>Peter</td><td>Croke</td></tr>\n
<tr><td>Elektra</td><td>Moore</td></tr>

linebreaks

快速将\n转换为<br />

Python

from django.utils.html import linebreaks

linebreaks('convert\ninto html paragraphs\ntest')

Python

output

<p>convert<br />into html paragraphs<br />test</p>

就是这样, 我希望你也能找到一些有趣的函数, 欢迎通过留言推荐.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET MVC是如何运行的(3): Controller的激活

ASP.NET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象,而这个过程是通过自定义的Url...

2218
来自专栏Spark学习技巧

重要 : 优化flink的四种方式

flink这个框架在逐步变为流处理的主流。本文,我们将针对flink性能调优讲四种不同的方法。

3232
来自专栏Coding01

学几个 Laravel Eloquent 方法和技巧

我第一次寻找所谓的 Laravel 框架的时候,我的其中一个目标就是要找:利用最简单的操作数据库的方法。后来目标就停在了 Eloquent ORM 上。

921
来自专栏wannshan(javaer,RPC)

dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传...

4866
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第七章 Kotlin 编译过程分析第七章 Kotlin 编译过程分析

http://mp.weixin.qq.com/s/lEFRH523W7aNWUO1QE6ULQ

1602
来自专栏向治洪

AndFix使用感想

AndFix已经使用了一段时间了,但是到AndFix上看了一下,最近2个月都没有更新代码了,有141个issues和3个pull request没人处理,其...

2186
来自专栏jeremy的技术点滴

py3_cookbook_notes_02

38112
来自专栏Linyb极客之路

工作流引擎之activiti利用juel进行条件分支判断

有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其ac...

1K6
来自专栏JAVA高级架构开发

Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。

2130
来自专栏非典型技术宅

Swift实践:使用CoreData存储多种数据类的通讯录1. CoreData支持存储数据类型2. 使用CoreData存储多种数据类的通讯录3. Codable

1853

扫码关注云+社区

领取腾讯云代金券