我有一个包含“用户名”和“等级”的表格。年级采用A+、A、A-、B+等格式。我试图为每个用户显示一个数字值的总等级。例如:
约翰·A+
曾傑瑞B+
约翰·C-
汤姆A-
曾傑瑞B+
所以,如果A+ = 10,以及后面的所有东西都是A =9和A- =8等等,我如何计算约翰所获得的总分数。我试图在DJANGO模板(.html)文件中这样做,而且似乎根本无法实现计数器。
发布于 2014-09-01 20:06:21
您可以为此编写自己的模板筛选器。在模板文件夹中名为“templatetag”的文件夹中创建一个名为“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 }}发布于 2014-09-01 19:12:48
根据设计,你不能在模板中做到这一点。django哲学是这样的,这种逻辑属于观点。
我们认为模板系统是控制表示和表示相关逻辑的工具,仅此而已。模板系统不应该支持超出这一基本目标的功能。
来源:https://docs.djangoproject.com/en/dev/misc/design-philosophies/#separate-logic-from-presentation
尽管它们确实允许您打破工具,编写自定义标记和过滤器,就像alexcxe所说的那样,但毫无疑问,将这种逻辑包含在视图中并将其作为上下文变量传递无疑更容易。我不知道你的模特长什么样,但是在这种情况下,一个小弟弟或一个元组是合适的。我不得不在类似的情况下做这两件事。如果你提供更多的细节,我可以给你一个具体的实现。
偶尔打破规则是可以的,但是我发现你是django的新手,所以在你知道什么时候还好之前,我建议遵循django社区设置的规则,特别是如果您的目标是与其他django开发人员一起工作的话。
https://stackoverflow.com/questions/25611216
复制相似问题