iterators.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. raise StopIteration()
  19. class FieldsetIterator(object):
  20. def __init__(self, form, name, fields):
  21. self._index = -1
  22. self.form = form
  23. self.name = name
  24. self.fields = fields
  25. def __iter__(self):
  26. return self
  27. def next(self):
  28. self._index += 1
  29. try:
  30. row = self.fields[self._index]
  31. if isinstance(row, basestring):
  32. field_name = row
  33. return self.form[field_name]
  34. field_name = row[0]
  35. field = self.form[field_name]
  36. field.extra = row[1]
  37. return field
  38. except IndexError:
  39. raise StopIteration()
  40. except KeyError:
  41. raise KeyError('Field "%s" could not be found in iterated form.' % field_name)