我正在尝试在django模板页面上显示调查结果。我不能根据特定的人口统计数据和每个类别的评级来显示平均值。我已经在调查表单视图中将调查响应数据保存为整数。这是我到目前为止所做的事情:
#views.py
def statistics(request):
male = Survey.objects.filter(gender='male')
...
#Other demographics filtered
...
def avgcalc(myDemographic, myCategory):
ratings = []
for x in myDemographic:
ratings.append(myCategory)
intTotal = 0
intCount = 0
intLenMyList = len(myDemographic)
while(intCount < intLenMyList):
intTotal += ratings[intCount]
intCount += 1
return intTotal/intLenMyList
...
#rest of view rendering template, etc.
现在是我遇到问题的地方。如何根据人口统计信息轻松显示每个类别的数据?例如,在我的模板中我想做
#template.html
Demographic: Male
Total responses for this demographic: {{ male|length }}
Average response for specific category: {{ avgcalc(male, category) }}
{{male | length}}可以很好地显示男性受访者的数量。但是,在模板中,我不能使用{{avgcalc(male,category)}}。实际上,我已经设置了一个表格,并且有大约20个人口统计数据和十几个类别评级,所以如果可能的话,我希望避免将每个人放在我的视图中(即male_category_calc = avgcalc(男性,类别)对于每个人口统计和类别。这是否可能,或者我是否需要在很长的路上完成?我可以将每个键入到我的模板中,只要它有效。感谢您的帮助或建议。< / p>
答案 0 :(得分:0)
您可以使用custom template tag or filter扩展模板功能。像这样:
<强> foo_app / templatetags / foo_tags.py:强>
from django import template
register = template.Library()
@register.filter
def avgcalc(myDemographic, myCategory):
ratings = []
for x in myDemographic:
ratings.append(myCategory)
intTotal = 0
intCount = 0
intLenMyList = len(myDemographic)
while(intCount < intLenMyList):
intTotal += ratings[intCount]
intCount += 1
return intTotal/intLenMyList
然后在 template.html :
中{% load foo_tags %}
{{ male|avgcalc:category }}
答案 1 :(得分:0)
您可以使用django的自定义模板标记来执行此操作。
要计算平均值,您可能需要查看django的aggregation
他们使用Avg函数来计算特定字段的平均值。 (在您的情况下是类别)
from django.db.models import Avg
Model.objects.all().aggregate(Avg('attribute'))