亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2017年07月03日 16:26:50   作者:MnCu  
本篇文章主要介紹了django中自定義標簽和過濾器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

想要實現(xiàn)自定義標簽和過濾器需要進行準備工作:

準備(必需)工作:

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

polls/
  __init__.py
  models.py
  templatetags/
    __init__.py
    mytags.py
  views.py

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

INSTALLED_APPS = (
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'polls',
)

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

from django import template

register = template.Library()

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

{% load mytags %}

自定義過濾器:

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

2  django會將過濾器前的值傳入該函數(shù)

3  函數(shù)完成后,需要進行登記register

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

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

1  定義一個  truncate_chars  函數(shù)

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

2  register該函數(shù)

# 登記
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)函數(shù)默認需要兩個參數(shù),name是裝飾器的名稱(字符串類型),function是函數(shù)名。后面三個參數(shù)可以參考 官方文檔。 我們也可以通過裝飾器進行登記

@register.filter(name='truncate_filter')
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

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

@register.filter
def truncate_chars(value):
  if value.__len__() > 30:
    return '%s......'% value[0:30]
  else:
    return value

3  測試模板文件內(nèi)容

{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}
</body>
</html>

4  瀏覽器顯示結(jié)果

自定義標簽

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

自定義標簽分為很多類型

1  簡單標簽  Simple tags

2  內(nèi)含標簽  Inclusion tags

3  分配標簽  Assignment tags

一  簡單標簽

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參數(shù)可以讓我們訪問模板的當(dāng)前環(huán)境上下文,即將當(dāng)前環(huán)境上下文中的參數(shù)和值作為字典傳入函數(shù)中的一個名為context的參數(shù)

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

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

二  內(nèi)含標簽

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

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

from django import template
register = template.Library()

@register.inclusion_tag('result.html')
def test():
  a=['first','second','third']
  return {'choices':a}

result.html 內(nèi)容

<ul>
{% for choice in choices %}
  <li> {{ choice }} </li>
{% endfor %}
</ul>

test.html內(nèi)容

{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
{% test %}
</body>
</html>

view函數(shù):

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

當(dāng)訪問http://127.0.0.1:8000/test/時,瀏覽器顯示:

 

三  分配標簽

類似于簡單標簽,但并不會輸出結(jié)果,可以使用 as 關(guān)鍵字將結(jié)果賦給一個參數(shù)。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論