Mam dziwny problem przy użyciu itertools.groupby
do grupowania elementów zapytania. Mam modelu Resource
:itertools.groupby w szablonie django
from django.db import models
TYPE_CHOICES = (
('event', 'Event Room'),
('meet', 'Meeting Room'),
# etc
)
class Resource(models.Model):
name = models.CharField(max_length=30)
type = models.CharField(max_length=5, choices=TYPE_CHOICES)
# other stuff
Mam kilka zasobów w mojej bazy danych sqlite:
>>> from myapp.models import Resource
>>> r = Resource.objects.all()
>>> len(r)
3
>>> r[0].type
u'event'
>>> r[1].type
u'meet'
>>> r[2].type
u'meet'
Więc jeśli grupa ze względu na rodzaj, ja naturalnie dostać dwie krotki:
>>> from itertools import groupby
>>> g = groupby(r, lambda resource: resource.type)
>>> for type, resources in g:
... print type
... for resource in resources:
... print '\t%s' % resource
event
resourcex
meet
resourcey
resourcez
Mam teraz tę samą logikę:
class DayView(DayArchiveView):
def get_context_data(self, *args, **kwargs):
context = super(DayView, self).get_context_data(*args, **kwargs)
types = dict(TYPE_CHOICES)
context['resource_list'] = groupby(Resource.objects.all(), lambda r: types[r.type])
return context
Ale kiedy iteracyjnego w moim szablonu, niektóre zasoby brakuje:
<select multiple="multiple" name="resources">
{% for type, resources in resource_list %}
<option disabled="disabled">{{ type }}</option>
{% for resource in resources %}
<option value="{{ resource.id }}">{{ resource.name }}</option>
{% endfor %}
{% endfor %}
</select>
Czyni to jako:
myślę jakoś subiterators są potwierdzili już ponad, ale nie jestem pewien, jak to się mogło stać.
(Korzystanie z Pythona 2.7.1, Django 1.3).
(EDIT: Jeśli ktoś to czyta, polecam za pomocą wbudowanego w regroup
template tag zamiast korzystania groupby
).
Dzięki za zbadanie; Próbowałem z ~ 10 zasobami i miałem co najwyżej jeden zasób na grupę - naprawiłem to poprzez zapełnienie kontekstu przez '(t, list (r)) dla t, r w groupby (...)' –
Tak, iterator jest pre-iterowany, Django konwertuje iterator na listę bez iteracji po zgrupowanych elementach. Dodałem wyjaśnienie w osobnej odpowiedzi. –