在Django模板中对列表进行排序和索引?
如何在把一个对象传给模板之前,对它进行复杂的排序呢?比如说,这里有我的视图:
@login_required
def overview(request):
physicians = PhysicianGroup.objects.get(pk=physician_group).physicians
for physician in physicians.all():
physician.service_patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order')
return render_to_response('hospitalists/overview.html', RequestContext(request, {'physicians': physicians,}))
在模板中,医生对象的顺序不对,为什么会这样呢?
另外,如何在模板中访问列表里的某个元素呢?比如说,这个方法就不行:
{% for note_type in note_types %}
<div><h3>{{ note_type }}</h3>
{% for notes in note_sets.index(parent.forloop.counter0) %}
#only want to display the notes of this note_type!
{% for note in notes %}
<p>{{ note }}</p>
{% endfor %}
{% endfor %}
</div>
{% endfor %}
非常感谢,Pete
4 个回答
你应该在视图里构建一个有序的查询集,然后把它传递给你的模板:
def myview(request):
patients = Physician.patients.order_by('bed__room__unit',
'bed__room__order',
'bed__order')
return render_to_response('some_template.html',
dict(patients=patients),
mimetype='text/html')
你的模板可以循环遍历 patients
,这个里面会包含有序的结果。这样做对你来说不行吗?
补充说明:关于索引,只需要使用点语法:在模板中 mylist.3
在Python中变成 mylist[3]
。想了解更多信息,可以查看这个链接:http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context。
“我想在模板中做到这一点:”
别这样。应该在视图函数中处理,这才是正确的地方。
因为问题描述得不够完整,所以很难猜测数据模型是什么样的,也就无法提供准确的解决方案。
results= physician.patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order')
这样就足够了。把 results
传给模板进行渲染,这样顺序是对的。
如果排序不正确(可能是因为模型的某些细节问题),你总是可以使用另一种方法。
def by_unit_room_bed( patient ):
return patient.bed.room.unit, patient.bed.room.order, patient.bed.order
patient_list = list( physician.patients )
patient_list.sort( key=by_unit_room_bed )
把 patient_list
传给模板进行渲染,这样顺序也是对的。
“如何在模板中索引一个列表”
我不太确定你想做什么,但大多数情况下,答案是“别这样”。应该在视图函数中处理。
模板只是简单地遍历列表,填充简单的HTML模板。
如果在模板中看起来太复杂,那就真的太复杂了。保持模板简单——它只是用来展示的。处理逻辑应该放在视图函数中。
正如其他人所提到的,你的两个问题最好在模板之外解决——可以在模型或者视图中处理。一个可行的办法是给相关的类添加一些辅助方法。
获取医生患者的排序列表:
class Physician(Model):
...
def sorted_patients(self):
return self.patients.order_by('bed__room__unit',
'bed__room__order',
'bed__order')
然后在模板中,使用 physician.sorted_patients
而不是 physician.patients
。
关于“显示这个类型的笔记”,听起来你可能需要为笔记类型类添加一个 notes
方法。从你的描述中,我不太确定这是否是一个模型类,但原则是一样的:
class NoteType:
...
def notes(self):
return <calculate note set>
然后在模板中:
{% for note_type in note_types %}
<div><h3>{{ note_type }}</h3></div>
{% for note in note_type.notes %}
<p>{{ note }}</p>
{% endfor %}
</div>
{% endfor %}