zoukankan      html  css  js  c++  java
  • django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能通过键值的方式取出原有数据,对象不能通过(.)的方式直接取出数据,通过大量地查阅资料,最终通过过滤器(filter)的方式解

    1、需要传递到template的数据,在 views.py 中的index函数中

      latest_article_list 是一个Article对象的列表,包含文章ID、作者、发布时间、分类等各种信息

      dic['tag_list'] 为一个列表(文章标签列表)

      articles_info是一个以字典为元素的列表,而且该字典中 键'article'对应的不是普通变量,而是一个Article对象

    view.py

     1 def index(request):
     2     latest_article_list = Article.objects.query_by_time()
     3     articles_info = []
     4     dic = {}
     5     for article in latest_article_list:
     6         taginfo = Article.objects.get(id=article.id)
     7         dic['tag_list'] = taginfo.tags.all()
     8         dic['article'] = article;
     9         articles_info.append(dic)
    10         dic = {}
    11 
    12     loginform = LoginForm()
    13     context = {'articles_info':articles_info, 'loginform':loginform}
    14     return render(request, 'index.html', context)

    2、template如何引用views传递过来的变量值?

      在index.html中,可以先遍历列表,得到每一个字典变量;

    1 {% for article_info in articles_info %}

      遍历 articles_info 之后的article_info 为一个字典,通过前面的views可以知道里面包含了一个article对象和一个tag_list列表;

      对于article_info这个字典变量,在模板中却不能通过键值对获取对应的值,更别说获取Article对象中ID、作者、发布时间等属性值了,为了解决这一问题,这里就需要过滤器才能实现;

    3、自定义过滤器

      1)、在app目录下建立templagetags文件夹,在此目录下建立空文件 __init__.py和过滤器文件articleinfo.py;

      2)、编辑 articleinfo.py,添加过滤器 get_key 和get_attr,get_key获取字典不同键对应的值,get_attr获取Article对象中不同字段对应的值;

    articleinfo.py

     1 from django import template
     2 register = template.Library()
     3 
     4 @register.filter
     5 def get_key(d, key_name):
     6     return d.get(key_name)
     7 
     8 @register.filter
     9 def get_attr(d, m):
    10     if hasattr(d, m):
    11         return getattr(d, m)

    4、模板中使用过滤器,获取各种变量值;

      index.html中,首先需要通过标签加载上面定义的过滤器文件 articleinfo.py,然后就是index.html模板中调用过滤器了,具体的使用方法见下面的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值,所以只好双重过滤器来实现了。

     

    index.html

     1 {% for article_info in articles_info %}
     2     <div class="row">
     3         <article class="col-xs-12">
     4             <h3><a id="article_title", href="/focus/{{ article_info|get_key:"article"|get_attr:"id" }}">{{ article_info|get_key:"article"|get_attr:"title" }}</a></h3>
     5             <div class="article_info">
     6                 <span class="">{{ article_info|get_key:"article"|get_attr:"author" }}</span>
     7                 <span class="">{{ article_info|get_key:"article"|get_attr:"create_time"|date:"Y-m-d H:i" }}</span>
     8             </div>
     9             <div class="category">
    10                 分类:
    11                  <a href="#" class>{{ article_info|get_key:"article"|get_attr:"category" }}</a>
    12             </div>
    13             <div class="category">
    14                 标签:
    15                 {% for tag in article_info|get_key:"tag_list" %}
    16                     <a href="#">{{ tag }}</a>
    17                 {% endfor %}
    18             </div>
    19             <p>{{ article_info|get_key:"article"|get_attr:"content"|truncatechars_html:80 | safe }}</p>
    20             <p><button class="btn btn-default" onclick="window.location.href='/focus/{{ article_info|get_key:"article"|get_attr:"id" }}' ">Read More</button></p>
    21             <ul class="list-inline">
    22                 <li><a href="#"><span class="glyphicon glyphicon-comment"></span>{{ article_info|get_key:"article"|get_attr:"comment_num" }} Comments</a></li>
    23                 <li><a href="#"><span class="glyphicon glyphicon-thumbs-up"></span>{{ article_info|get_key:"article"|get_attr:"like_num" }} Likes</a></li>
    24             </ul>
    25         </article>
    26     </div>            
    27     <hr>
    28 {% endfor %}

      

  • 相关阅读:
    16. 3Sum Closest
    17. Letter Combinations of a Phone Number
    20. Valid Parentheses
    77. Combinations
    80. Remove Duplicates from Sorted Array II
    82. Remove Duplicates from Sorted List II
    88. Merge Sorted Array
    257. Binary Tree Paths
    225. Implement Stack using Queues
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/justbreaking/p/6965757.html
Copyright © 2011-2022 走看看