Django自定义模板标签

django框架 2018-07-15 943

在学习有这样一个程序要求实现单个投票项的总投票数和项数

使用一般方法过于复杂,最优法是使用自定义模板标签。

<div class="panel panel-default">
    <div class="panel-heading">Panel heading</div>
    <ul class="list-group">{% for poll in all_polls %}
        <li class="list-group-item">
<a href="{% url 'poll_detail' poll.id %}"><span class="glyphicon glyphicon-check" aria-hidden="true"></span>  
<span>总票数:{{ poll.id|show_votes }}    
项数:{{ poll.id|show_items }} {{ poll.name }} add by {{ poll.user }},created at {{ poll.created }}</span>  
</a> 
        </li>{% endfor %}</ul>
</div>

其中,总票数:{{ poll.id|show_votes }}和项数:{{ poll.id|show_items }}中的show_votes,show_items 属于自定义模板标签。其实show_votes属于函数,poll.id是它的参数,多个参数使用:连接。

创建自定义模板标签,在APP目录下新建一个文件夹templates,在新建一个.py文件,templates下要建一个__init__.py文件,

from django import template  
from pollitem import models

register = template.Library()  

@register.filter(name=&#39;show_items&#39;)  
def show_items(value):  
    try:  
        poll = models.Poll.objects.get(id=int(value))  
        items = models.PollItem.objects.filter(poll=poll).count()  
    except:  
        items = 0  
    return items  
@register.filter(name='show_votes')  
def show_votes(value):  
    try:  
        poll = models.Poll.objects.get(id=int(value))  
        votes = 0  
        pollitems = models.PollItem.objects.filter(poll=poll)  
        for pollitem in pollitems:  
            votes = votes + pollitem.vote  
    except:  
        votes = 0  
    return votes  

重点:
第一处:导入template,使用template.Library()产生注册对象register 
第二处:使用修饰词@register.filter(name='show_votes')把自定义模板标签注册成模板语言得一部分。
第三使用:在使用的文件前加上

标签:django框架

文章评论

评论列表

已有0条评论