• 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 %}

      

  • 相关阅读:
    window、BOM、 document、 DOM
    React事件处理和原生JS事件处理
    React项目性能优化
    React条件渲染
    Aqua Data Studio中文乱码
    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
    Myeclipse 全局搜索的时候报错problems encountered during text search
    PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
    工作总结
    前进中不能迷失方向--Java程序员职业发展路线
  • 原文地址:https://www.cnblogs.com/justbreaking/p/6965757.html
Copyright © 2020-2023  润新知