激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解django中自定義標簽和過濾器

詳解django中自定義標簽和過濾器

2020-11-22 21:56MnCu Python

本篇文章主要介紹了django中自定義標簽和過濾器,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

想要實現自定義標簽過濾器需要進行準備工作:

準備(必需)工作:

1  在某個app下創建一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下創建了一個templatetags的包,并在該包下創建了一個名為mytags的文件。那么目錄結構看起來應該就像這樣:

?
1
2
3
4
5
6
7
polls/
  __init__.py
  models.py
  templatetags/
    __init__.py
    mytags.py
  views.py

2  settings文件中的INSTALLD_APPS內必須含有該app。接下來,我們需要確認settings文件中的INSTALLED_APPS變量中已經有了polls

?
1
2
3
4
5
6
7
8
9
INSTALLED_APPS = (
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'polls',
)

3  接下來在mytags文件中寫入如下幾行

?
1
2
3
from django import template
 
register = template.Library()

4  在模板中使用{% load %} 標簽裝載自定義標簽或者裝飾器

?
1
{% load mytags %}

自定義過濾器:

1  自定義過濾器實際上就是寫一個函數

2  django會將過濾器前的值傳入該函數

3  函數完成后,需要進行登記register

因為第二步django已經幫我們完成,所以我們實際上只需要自己完成第一步和第三步

實例:寫一個自動省略多余字符串的過濾器 

1  定義一個  truncate_chars  函數

?
1
2
3
4
5
6
# 若字符串長度大于30,則省略之后的內容,否則原樣輸出該字符串。參數value就是過濾器前的值
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

2  register該函數

?
1
2
3
4
5
6
7
# 登記
register.filter('truncate_chars',truncate_chars)
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

Library.filter(name,function,is_safe=False,needs_autoescape=False,excepts_localtime=False)函數默認需要兩個參數,name是裝飾器的名稱(字符串類型),function是函數名。后面三個參數可以參考 官方文檔。 我們也可以通過裝飾器進行登記

?
1
2
3
4
5
6
@register.filter(name='truncate_filter')
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

如果沒有使用name參數,django默認會將函數名作為name參數的值,所以下面的代碼和上面的代碼作用相同。

?
1
2
3
4
5
6
@register.filter
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

3  測試模板文件內容

?
1
2
3
4
5
6
7
8
9
10
11
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}
</body>
</html>

4  瀏覽器顯示結果

詳解django中自定義標簽和過濾器

自定義標簽

自定義標簽相對于自定義過濾器來說要復雜很多,因為自定義標簽可以做任何事情!

自定義標簽分為很多類型

1  簡單標簽  Simple tags

2  內含標簽  Inclusion tags

3  分配標簽  Assignment tags

一  簡單標簽

?
1
2
3
4
5
6
7
8
import datetime
from django import template
 
register = template.Library()
 
@register.simple_tag
def current_time(format_string):
  return datetime.datetime.now().strftime(format_string)

Library.simple_tag(takes_context=True)  takes_context=True參數可以讓我們訪問模板的當前環境上下文,即將當前環境上下文中的參數和值作為字典傳入函數中的一個名為context的參數

?
1
2
3
4
@register.simple_tag(takes_context=True)
def current_time(context, format_string):
  timezone = context['timezone']
  return your_get_current_time_method(timezone, format_string)

當使用take_context=True時,函數的第一個參數必需為context。也可以使用name參數對函數進行重命名。

二  內含標簽

這種類型的標簽可以被其他模板進行渲染,然后將渲染結果輸出

Library.inclusion_tag()支持take_context=True,用法類似Library.simple_tag()

?
1
2
3
4
5
6
7
from django import template
register = template.Library()
 
@register.inclusion_tag('result.html')
def test():
  a=['first','second','third']
  return {'choices':a}

result.html 內容

?
1
2
3
4
5
<ul>
{% for choice in choices %}
  <li> {{ choice }} </li>
{% endfor %}
</ul>

test.html內容

?
1
2
3
4
5
6
7
8
9
10
11
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
{% test %}
</body>
</html>

view函數:

?
1
2
def test(request):
  return render(request,'test.html')

當訪問http://127.0.0.1:8000/test/時,瀏覽器顯示:

詳解django中自定義標簽和過濾器

三  分配標簽

類似于簡單標簽,但并不會輸出結果,可以使用 as 關鍵字將結果賦給一個參數。

?
1
2
3
@register.assignment_tag
def get_current_time(format_string):
  return datetime.datetime.now().strftime(format_string)
?
1
2
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/MnCu8261/p/5934203.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年人在线免费播放视频 | 国产亚洲精品视频中文字幕 | 国产精品久久久久久久久久了 | 在线a| 久久精片 | 成人精品视频网站 | 中文字幕在线观看亚洲 | 黄网站进入 | 国产中出在线观看 | av国产片| 精品一区二区三区免费爱 | 日韩在线观看电影 | 国产精品视频2021 | 亚洲免费高清 | 性盈盈盈影院 | 亚洲一级毛片 | 久草网在线 | 黄色一级片毛片 | 91专区在线观看 | 久久噜噜噜精品国产亚洲综合 | 久久精品a一级国产免视看成人 | 精品国产乱码一区二区 | 国产精选久久久 | 99久久精品免费看国产小宝寻花 | 成年人毛片视频 | 成人 日韩 | 欧美一级黄色免费看 | 爱爱视频天天干 | 色婷婷久久久亚洲一区二区三区 | av日韩一区二区 | 久久精品视频一区二区三区 | 国产午夜三级一区二区三桃花影视 | 999久久久国产999久久久 | 狠狠操人人干 | asian超清日本肉体pics | 国产一区国产二区在线观看 | av资源在线 | 久草最新网址 | 成人在线免费观看视频 | 欧美伦交 | 一级毛片在线观看免费 |