【问题标题】:summing up values from database in DJANGO template在 DJANGO 模板中汇总数据库中的值
【发布时间】:2014-09-01 18:24:01
【问题描述】:

我有一个包含“用户名”和“成绩”的表。成绩有A+、A、A-、B+等格式。我正在尝试使用数值显示每个用户的总成绩。例如:

约翰·A+

杰瑞 B+

约翰·C-

汤姆 A-

杰瑞 B+

因此,如果 A+ = 10 并且其他所有内容为 A =9 和 A- =8 等等,我如何计算约翰获得的总成绩。我正在尝试在 DJANGO 模板 (.html) 文件中执行此操作,但似乎根本无法实现计数器

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    您可以为此编写自己的模板过滤器。在模板文件夹中名为“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 }}
    

    【讨论】:

      【解决方案2】:

      这是设计使然,您不能在模板中这样做。 django 哲学使得这种逻辑属于视图。

      我们将模板系统视为控制演示和演示相关逻辑的工具,仅此而已。模板系统不应支持超出此基本目标的功能。

      来源:https://docs.djangoproject.com/en/dev/misc/design-philosophies/#separate-logic-from-presentation

      尽管它们确实允许您像 alexcxe 所说的那样破坏工具并编写自定义标签和过滤器,但在您的视图中包含这种逻辑并将其作为上下文变量传递无疑更容易。我不知道您的模型是什么样的,但是在这种情况下,字典或元组会很合适。我不得不在类似的情况下做这两个。如果你提供更多细节,我可以给你一个具体的实现。

      偶尔打破规则是可以的,但我收集到你是 django 的新手,所以在这一点上,直到你知道什么时候可以,我建议遵循 django 社区制定的规则,特别是如果您的目标是与其他 django 开发人员合作。

      【讨论】:

      • 试图给出一个答案——无论它是多么错误或正确——对错误的问题无济于事。
      • 嗯,我认为您试图提供的信息是有用且重要的,只要在应使用时附带免责声明即可。我认为你不应该删除它。它绝对有效且相关
      • 嗯,我想要得到的是,你应该只是编辑你的答案而不是删除整个事情,因为我认为我们的两个答案一起提供了一个比单独一个更好的视角。软件开发是一个新领域。 Web 开发,更是如此。没有人做对了,也没有人把一切都弄清楚了,所以我认为对于新来的人来说,亲眼目睹这种不一致是件好事
      • +1 指出哲学,我不认为这是一个糟糕的回应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2016-06-05
      • 2018-06-14
      • 2011-07-10
      相关资源
      最近更新 更多