如何在模板中使用函数?

时间:2014-05-06 00:25:21

标签: python django django-views

在下图中,您将看到排名网格,但您也会看到没有值的列。

这是以下功能:它根据IDemployee计算每个用户的总分数。我需要的是找到一种方法将点传递给for循环上的模板,以便它可以与每个用户相关。我不知道是否可以在Django模板系统中嵌入Python函数。

{% for fields in employee %}

   {{fields.name}}
   {{fields.department}}
   {{fields.username}}

    {{ mypoints(fields.id) }} // the total points of user based on my_points() function.

同时寻找一种基于积分在DESCENDING ORDER订购它们的方法。

有什么想法吗?

Table view

def my_points(idemployee):

answer_query = answers.objects.select_related(
    'question').filter(empleado=idemployee)

points_total = 0
match = 0

for answer in answer_query:

    if answer.question.golesEquipoA == answer.equipoA and answer.question.golesEquipoB == answer.equipoB:
        points_total += 4
        match += 1
    else:

        if answer.question.golesEquipoA == answer.question.golesEquipoB and answer.equipoA == answer.equipoB:
            points_total += 3
            match += 1

        else:

            if answer.question.golesEquipoA < answer.question.golesEquipoB and answer.equipoA < answer.equipoB:
                points_total += 3
                match += 1

    if answer.question.golesEquipoA > answer.question.golesEquipoB and answer.equipoA > answer.equipoB:
        points_total += 3
        match += 1

args = {}
args['points'] = points_total
args['match'] = match

return args

2 个答案:

答案 0 :(得分:0)

<强>功能

您无法在模板中创建Functions,因为模板用于显示信息,而且大多数情况下不处理业务逻辑。但是,您可以在template tags中使用大于,小于等类型的简单评估者。以下是官方文档:

https://docs.djangoproject.com/en/dev/ref/templates/builtins/

降序

使用order_by

因此Employee模型按Puntos排序:

employee = Employee.objects.order_by('-puntos')

然后只需将employee上下文添加到您的视图中。  请注意,minus sign之前的puntos表示descending订单。没有它,它将返回ascending

答案 1 :(得分:0)

您无法直接调用django模板引擎中的函数。您可以使用django模板过滤器实现此目的。试试这种方式,

from django import template

register = template.Library()

@register.filter
def my_points(idemployee):

    answer_query = answers.objects.select_related(
        'question').filter(empleado=idemployee)

    points_total = 0
    match = 0

    for answer in answer_query:

        if answer.question.golesEquipoA == answer.equipoA and answer.question.golesEquipoB == answer.equipoB:
            points_total += 4
            match += 1
        else:

            if answer.question.golesEquipoA == answer.question.golesEquipoB and answer.equipoA == answer.equipoB:
                points_total += 3
                match += 1

            else:

                if answer.question.golesEquipoA < answer.question.golesEquipoB and answer.equipoA < answer.equipoB:
                    points_total += 3
                    match += 1

        if answer.question.golesEquipoA > answer.question.golesEquipoB and answer.equipoA > answer.equipoB:
            points_total += 3
            match += 1

    args = {}
    args['points'] = points_total
    args['match'] = match

    return args

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters