Django自定义模板标签

django框架 2018-07-15 1229

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

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

<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>
Markup

其中,总票数:{{ 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
Python
@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
Python

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

标签:django框架

文章评论

评论列表

已有0条评论