对Django模板中的列表进行排序和索引?

时间:2009-07-28 01:07:41

标签: python django django-templates

如何在将对象传递给模板之前对对象执行复杂排序?例如,这是我的观点:

@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 个答案:

答案 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 %}