在寫網站的時候遇到了一個問題:html
Django在後端向前端傳數據時,多數會使用dict字典來傳送多個數據,但前端只能遍歷,沒有一個用key取到value值的方法能夠直接使用前端
若是做爲一個list傳遞到前端,結構相同狀況下,遍歷確實夠用。可是使用dict時多數會使用單個key取value放到不一樣的地方使用,Django提供的方法就不夠用了。java
因此這篇文章介紹一下如何建立一個自定義函數供使用,此文中寫了一個用key取到value值的函數python
一、在某個app中建立一個新的templatetags
文件,templatetags
文件與url.py、views.py同級django
下圖爲名爲west的app目錄結構後端
要保證這個app已經寫到了整個Django項目的INSTALLED_APPS中,在Django項目根路徑下的settings.py文件中文件中查看此app是否已經加入整個項目,若是沒有則添加上,代碼以下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'west', #此處就是這個app的名字
]
二、而後在此目錄下新建兩個py文件,__init__.py和一個自定義的py文件。以下圖session
__init__.py文件是讓Django框架知道這是一個Python package,裏面不須要寫代碼,可是不能沒有這個文件。由於第一步中已經肯定了app已經添加到INSTALLED_APPS中,因此這個package也被項目歸入其中。app
dict_fun.py則是本身寫的方法文件框架
dict_fun.py文件以下,其中須要注意的地方已經註釋函數
from django import template
register = template.Library() #以上兩行代碼是獲取到Django模板全部tags和filter的library,以便咱們寫入一個新的方法
def dict_get(adict, key): #自定義方法,adict是咱們使用這個方法的調用者,key是dict_get方法的參數,若是不太懂,接着往下看
"""get the value using key from a dict"""
return dict(adict).get(key)
register.filter('dict_get', dict_get) #將此方法添加到模板中
三、前端使用自定義方法
首先在模板(通常是html)中添加一個標籤,使剛纔寫的方法引入,注意此處的dict_fun對應的是在第一步中建立的dict_fun.py
{% load dict_fun %}
{{ a }}在django框架中即是使用後端傳遞過來數據的寫法。
使用本身寫的函數以下,可能一開始看起來並無那麼易懂。
{{ adict|dict_get:"pic" }}
dict是後端傳過來的數據,dict_get是在dict_fun.py中定義的函數,「pic」是dict_get方法的參數。一句話歸納就是:adict使用函數dict_get(),參數爲「pic」
還記得dict_get()方法在定義的時候有兩個參數嗎?其實第一個參數是調用者,被寫在了參數列表中
參考連接:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#registering-custom-filters