iterators.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. class FormIterator(object):
  2. def __init__(self, form, fieldsets=None):
  3. self._index = -1
  4. self.form = form
  5. try:
  6. self.fieldsets = fieldsets or form.fieldsets
  7. except AttributeError:
  8. raise AttributeError('Form fieldset could not be found. Either pass explicit "fieldsets" argument to FormIterator or define "fieldsets" attribute on form.')
  9. def __iter__(self):
  10. return self
  11. def next(self):
  12. self._index += 1
  13. try:
  14. return FieldsetIterator(self.form,
  15. self.fieldsets[self._index][0],
  16. self.fieldsets[self._index][1])
  17. except IndexError:
  18. self._index = -1
  19. raise StopIteration()
  20. class FieldsetIterator(object):
  21. def __init__(self, form, name, fields):
  22. self._index = -1
  23. self.form = form
  24. self.name = name
  25. self.fields = fields
  26. def __iter__(self):
  27. return self
  28. def next(self):
  29. self._index += 1
  30. try:
  31. row = self.fields[self._index]
  32. if isinstance(row, basestring):
  33. field_name = row
  34. return self.form[field_name]
  35. field_name = row[0]
  36. field = self.form[field_name]
  37. field.extra = row[1]
  38. return field
  39. except IndexError:
  40. raise StopIteration()
  41. except KeyError:
  42. raise KeyError('Field "%s" could not be found in iterated form.' % field_name)