我有一个包含"用户名"和"成绩"。等级的格式为A +,A,A-,B +等。我试图用数值显示每个用户的总成绩。例如:
John A +
杰瑞B +John C -
Tom A -
杰瑞B +因此,如果A + = 10,其他所有内容如A = 9和A- = 8等等,我如何计算John所获得的总成绩。我试图在DJANGO模板(.html)文件中执行此操作,并且似乎无法实现计数器
答案 0 :(得分:4)
您可以为此编写自己的模板过滤器。在模板文件夹中名为“templatetags”的文件夹中创建一个名为“grade_filters.py”的新python文件,并声明一个新的模板标签,如下所示:
from django import template
register = template.Library()
def grade_to_number(grade):
map_dict = {'A+': 10, 'A':9, 'A-':8}
if grade in map_dict:
return map_dict[grade]
else:
return 0
@register.filter(name='sum_of_grades')
def return_item(grade_list):
new_grades_list = [grade_to_number(grade) for grade in grade_list]
try:
return sum(new_grades_list)
except:
return 0
@register.filter(name='get_list_for_student')
def return_item(student_list, name):
return student_list.filter(name=name)
现在,您可以在模板中加载带有
的新模板标签{% load grade_filters %}
计算一名学生的成绩总数:
{{ gradelist|get_list_for_student:'John'|sum_of_grades }}
答案 1 :(得分:2)
按照设计,您无法在模板中执行此操作。 django哲学就是这种逻辑属于观点。
我们将模板系统视为控制演示和演示相关逻辑的工具 - 就是这样。模板系统不应支持超出此基本目标的功能。
来源:https://docs.djangoproject.com/en/dev/misc/design-philosophies/#separate-logic-from-presentation
尽管他们确实允许你打破工具并编写自定义标签和像alexcxe这样的过滤器,但是在视图中包含这种逻辑并将其作为上下文变量传递无疑更容易。我不知道你的模型是什么样的,但是在这种情况下,dict或tuple会适合。我必须在类似的情况下做两件事。如果您提供更多详细信息,我可以为您提供具体的实施方案。
每隔一段时间就可以打破规则,但我会收集到你是django的新手,所以在这一点上,直到你知道什么时候没关系,我建议遵循django社区设定的规则,特别是如果你的目标是与其他django开发人员合作。