探索Django utils
Posted November 16, 2018
Django utils 提供了很多實用的功能.
Crypto
Module: django.utils.crypto
get_random_string
獲取隨機字符串函數, 默認是返回長度爲12的隨機字符串。 可以通過參數傳遞長度.
from django.utils.crypto import get_random_string get_random_string()
output
'5QxAxqyhsyJM'
你可以傳遞參數, 獲取指定長度的字符串
get_random_string(50)
output
'lrWYnyxhnXpwmjHDzmdgTFaIi1j73cKD5fPDOPwuVBmmKxITYF'
也可以指定字符串的選值範圍
get_random_string(12, '0123456789')
output
'805379737758'
Dates
Module: django.utils.dates
常用日期的集合, 日期的人性化顯示.
WEEKDAYS
from django.utils.dates import WEEKDAYS
WEEKDAYS = { 0: _('Monday'), 1: _('Tuesday'), 2: _('Wednesday'), 3: _('Thursday'), 4: _('Friday'), 5: _('Saturday'), 6: _('Sunday') }
WEEKDAYS_ABBR
from django.utils.dates import WEEKDAYS_ABBR
WEEKDAYS_ABBR = { 0: _('Mon'), 1: _('Tue'), 2: _('Wed'), 3: _('Thu'), 4: _('Fri'), 5: _('Sat'), 6: _('Sun') }
MONTHS
from django.utils.dates import MONTHS
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
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')
output
u'16 Nov 2018'
日期和時間一起
format(now, 'd/m/Y H:i')
output
u'16/11/2018 06:48'
DateParse
Module: django.utils.dateparse
將格式化後的字符串轉爲 date/time/datetime 對象. 如果字符串格式正確, 但表示無效時間將會返回 None.
parse_date
from django.utils.dateparse import parse_date parse_date('2018-11-16')
output
datetime.date(2018, 11, 16)
parse_time
from django.utils.dateparse import parse_time parse_time('14:54:02')
output
datetime.time(14, 54, 2)
parse_datetime
from django.utils.dateparse import parse_datetime parse_datetime('2018-11-16 14:54:02')
output
datetime.datetime(2018, 11, 16, 14, 54, 2)
HTML
Module: django.utils.html
urlize
將文本中的網址轉換爲<a>標籤
from django.utils.html import urlize urlize('You guys should visit this website www.google.com') print urlize('Please visit: https://jackeygao.io')
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地址
urlize('Send me a message to [email protected]')
output
'Send me a message to <a href="mailto:[email protected]">[email protected]</a>'
你也可以修剪鏈接顯示部分長度, 不足處以'...'替代
urlize('Please visit https://jackeygao.io/words/django-exploring-utils.html', 24)
output
Please visit <a href="https://jackeygao.io/words/django-exploring-utils.html">https://jackeygao.io/...</a>
escape
對html 特殊字符編碼
from django.utils.html import escape escape("<strong style='font-size: 12px'>escaped html</strong>")
output
'<strong style='font-size: 12px'>escaped html</strong>'
這將導致已轉義的字符串再次被轉義
escaped_html = escape("<strong>escaped html</strong>") # '<strong>escaped html</strong>' escape(escaped_html) # '&lt;strong&gt;escaped html&lt;/strong&gt;'
如果不想這樣, 請改用conditional_escape()
conditional_escape
escaped_html = conditional_escape("<strong>escaped html</strong>") # '<strong>escaped html</strong>' conditional_escape(escaped_html) # '<strong>escaped html</strong>'
format_html
此函數類似格式化字符串(str.format()), 因爲安全的原因推薦使用format_html.
from django.utils.html import format_html format_html('<div class="alert {}">{}</>', 'warning', 'Watch out!')
output
'<div class="alert warning">Watch out!</>'
安全的格式化 HTML 代碼.
format_html('<div class="alert {}">{}</>', '<script>alert(1);</script>', 'Watch out!')
output
'<div class="alert <script>alert(1);</script>">Watch out!</>'
format_html_join
適用於快速用相同的方式格式化一組列表
format_html_join('\n', '<p>{}</p>', ['a', 'b', 'c'])
output
<p>a</p>\n<p>b</p>\n<p>c</p>
另外一個例子
data = [ ['success', 'Success message'], ['warning', 'Watch out!'], ['danger', 'Danger!!'], ] format_html_join('\n', '<div class="alert {0}">{1}</div>', data)
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一起使用.
format_html_join('\n', '<tr><td>{0}</td><td>{1}</td></tr>', ((u.first_name, u.last_name) for u in users))
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 />
from django.utils.html import linebreaks linebreaks('convert\ninto html paragraphs\ntest')
output
<p>convert<br />into html paragraphs<br />test</p>
就是這樣, 我希望你也能找到一些有趣的函數, 歡迎通過留言推薦.