如何在将对象传递给模板之前对对象执行复杂排序?例如,这是我的观点:
@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
答案 0 :(得分:11)
正如其他人所指出的那样,您的两个问题最好在模板外解决 - 无论是在模型中还是在视图中。一种策略是将辅助方法添加到相关类中。
获取医生患者的分类清单:
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
。
对于“显示此note_type的注释”,听起来您可能需要一个用于note_type类的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 %}
答案 1 :(得分:4)
“我想在模板中执行此操作:”
别。在它所属的视图函数中执行。
由于问题不完整,因此无法猜测数据模型并提供准确的解决方案。
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模板的简单列表。
如果模板看起来太复杂了,那就是。保持模板简单 - 它只是演示文稿。处理进入视图功能
答案 2 :(得分:1)
您应该能够在视图中构建有序查询集并将其传递给模板:
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。
答案 3 :(得分:0)
这是一种做法,虽然非常难看:
{% for note in note_sets|slice:"forloop.counter0"|first %}