django 自定義過濾器(filter)處理較為復雜的變量方法
簡述:django 在views中有數(shù)據(jù)需要通過字典(dict)的方式傳遞給template,該字典中又包含了字典,而且字典中的鍵值還是一個對象,在template中處理傳遞過來的數(shù)據(jù)的時候,字典不能通過鍵值的方式取出原有數(shù)據(jù),對象不能通過(.)的方式直接取出數(shù)據(jù),通過大量地查閱資料,最終通過過濾器(filter)的方式解決!
1、需要傳遞到template的數(shù)據(jù),在 views.py 中的index函數(shù)中
latest_article_list 是一個Article對象的列表,包含文章ID、作者、發(fā)布時間、分類等各種信息
dic['tag_list'] 為一個列表(文章標簽列表)
articles_info是一個以字典為元素的列表,而且該字典中 鍵'article'對應的不是普通變量,而是一個Article對象
view.py
def index(request):
latest_article_list = Article.objects.query_by_time()
articles_info = []
dic = {}
for article in latest_article_list:
taginfo = Article.objects.get(id=article.id)
dic['tag_list'] = taginfo.tags.all()
dic['article'] = article;
articles_info.append(dic)
dic = {}
loginform = LoginForm()
context = {'articles_info':articles_info, 'loginform':loginform}
return render(request, 'index.html', context)
2、template如何引用views傳遞過來的變量值?
在index.html中,可以先遍歷列表,得到每一個字典變量;
{% for article_info in articles_info %}
遍歷 articles_info 之后的article_info 為一個字典,通過前面的views可以知道里面包含了一個article對象和一個tag_list列表;
對于article_info這個字典變量,在模板中卻不能通過鍵值對獲取對應的值,更別說獲取Article對象中ID、作者、發(fā)布時間等屬性值了,為了解決這一問題,這里就需要過濾器才能實現(xiàn);
3、自定義過濾器
1)、在app目錄下建立templagetags文件夾,在此目錄下建立空文件 __init__.py和過濾器文件articleinfo.py;
2)、編輯 articleinfo.py,添加過濾器 get_key 和get_attr,get_key獲取字典不同鍵對應的值,get_attr獲取Article對象中不同字段對應的值;
articleinfo.py
from django import template
register = template.Library()
@register.filter
def get_key(d, key_name):
return d.get(key_name)
@register.filter
def get_attr(d, m):
if hasattr(d, m):
return getattr(d, m)
4、模板中使用過濾器,獲取各種變量值;
index.html中,首先需要通過標簽加載上面定義的過濾器文件 articleinfo.py,然后就是index.html模板中調(diào)用過濾器了,具體的使用方法見下面的index.html文件;
{% load articleinfo %}
下面的index.html中變量使用的部分代碼,使用了雙重過濾器提取出了所需要的變量;
比如第4行中
{{ article_info|get_key:"article"|get_attr:"id" }}
首先通過 article_info|get_key:"article" 獲取到字典中的article對象,但此處需要的是article對象中的ID屬性,由于并不能通過{{ article_info|get_key:"article".id }} 獲取到對應的ID值,所以只好雙重過濾器來實現(xiàn)了。
index.html
{% for article_info in articles_info %}
<div class="row">
<article class="col-xs-12">
<h3><a id="article_title", href="/focus/{{ article_info|get_key:" rel="external nofollow" article"|get_attr:"id" }}">{{ article_info|get_key:"article"|get_attr:"title" }}</a></h3>
<div class="article_info">
<span class="">{{ article_info|get_key:"article"|get_attr:"author" }}</span>
<span class="">{{ article_info|get_key:"article"|get_attr:"create_time"|date:"Y-m-d H:i" }}</span>
</div>
<div class="category">
分類:
<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class>{{ article_info|get_key:"article"|get_attr:"category" }}</a>
</div>
<div class="category">
標簽:
{% for tag in article_info|get_key:"tag_list" %}
<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ tag }}</a>
{% endfor %}
</div>
<p>{{ article_info|get_key:"article"|get_attr:"content"|truncatechars_html:80 | safe }}</p>
<p><button class="btn btn-default" onclick="window.location.href='/focus/{{ article_info|get_key:"article"|get_attr:"id" }}' ">Read More</button></p>
<ul class="list-inline">
<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-comment"></span>{{ article_info|get_key:"article"|get_attr:"comment_num" }} Comments</a></li>
<li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-thumbs-up"></span>{{ article_info|get_key:"article"|get_attr:"like_num" }} Likes</a></li>
</ul>
</article>
</div>
<hr>
{% endfor %}
以上這篇django 自定義過濾器(filter)處理較為復雜的變量方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Django錯誤:TypeError at / ''bool'' object is not callable解決
這篇文章主要介紹了Django 錯誤:TypeError at / 'bool' object is not callable解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
Python使用文件操作實現(xiàn)一個XX信息管理系統(tǒng)的示例
這篇文章主要介紹了Python使用文件操作實現(xiàn)一個XX信息管理系統(tǒng)的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
淺談Selenium+Webdriver 常用的元素定位方式
這篇文章主要介紹了淺談Selenium+Webdriver 常用的元素定位方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01

