您好,登錄后才能下訂單哦!
本篇文章為大家展示了django中怎么自定義過(guò)濾器,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
1、需要傳遞到template的數(shù)據(jù),在 views.py 中的index函數(shù)中
latest_article_list 是一個(gè)Article對(duì)象的列表,包含文章ID、作者、發(fā)布時(shí)間、分類等各種信息
dic['tag_list'] 為一個(gè)列表(文章標(biāo)簽列表)
articles_info是一個(gè)以字典為元素的列表,而且該字典中 鍵'article'對(duì)應(yīng)的不是普通變量,而是一個(gè)Article對(duì)象
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傳遞過(guò)來(lái)的變量值?
在index.html中,可以先遍歷列表,得到每一個(gè)字典變量;
{% for article_info in articles_info %}
遍歷 articles_info 之后的article_info 為一個(gè)字典,通過(guò)前面的views可以知道里面包含了一個(gè)article對(duì)象和一個(gè)tag_list列表;
對(duì)于article_info這個(gè)字典變量,在模板中卻不能通過(guò)鍵值對(duì)獲取對(duì)應(yīng)的值,更別說(shuō)獲取Article對(duì)象中ID、作者、發(fā)布時(shí)間等屬性值了,為了解決這一問(wèn)題,這里就需要過(guò)濾器才能實(shí)現(xiàn);
3、自定義過(guò)濾器
1)、在app目錄下建立templagetags文件夾,在此目錄下建立空文件 __init__.py和過(guò)濾器文件articleinfo.py;
2)、編輯 articleinfo.py,添加過(guò)濾器 get_key 和get_attr,get_key獲取字典不同鍵對(duì)應(yīng)的值,get_attr獲取Article對(duì)象中不同字段對(duì)應(yīng)的值;
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、模板中使用過(guò)濾器,獲取各種變量值;
index.html中,首先需要通過(guò)標(biāo)簽加載上面定義的過(guò)濾器文件 articleinfo.py,然后就是index.html模板中調(diào)用過(guò)濾器了,具體的使用方法見(jiàn)下面的index.html文件;
{% load articleinfo %}
下面的index.html中變量使用的部分代碼,使用了雙重過(guò)濾器提取出了所需要的變量;
比如第4行中
{{ article_info|get_key:"article"|get_attr:"id" }}
首先通過(guò) article_info|get_key:"article" 獲取到字典中的article對(duì)象,但此處需要的是article對(duì)象中的ID屬性,由于并不能通過(guò){{ article_info|get_key:"article".id }} 獲取到對(duì)應(yīng)的ID值,所以只好雙重過(guò)濾器來(lái)實(shí)現(xiàn)了。
index.html
{% for article_info in articles_info %} <div class="row"> <article class="col-xs-12"> <h4><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></h4> <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"> 標(biāo)簽: {% 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 %}
上述內(nèi)容就是django中怎么自定義過(guò)濾器,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。