code_junkie

How does Django Know the Order to Render Form Fields?

Nov 12th, 2011
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. class ContactForm(forms.Form):
  2. subject = forms.CharField(max_length=100)
  3. message = forms.CharField()
  4. sender = forms.EmailField()
  5.  
  6. class PrivEdit(ModelForm):
  7. def __init__(self, *args, **kw):
  8. super(ModelForm, self).__init__(*args, **kw)
  9. self.fields.keyOrder = [
  10. 'super_user',
  11. 'all_districts',
  12. 'multi_district',
  13. 'all_schools',
  14. 'manage_users',
  15. 'direct_login',
  16. 'student_detail',
  17. 'license']
  18. class Meta:
  19. model = Privilege
  20.  
  21. class ContactForm(forms.Form):
  22. subject = forms.CharField(max_length=100)
  23. message = forms.CharField()
  24. def __init__(self,*args,**kwargs):
  25. forms.Form.__init__(self,*args,**kwargs)
  26. #first argument, index is the position of the field you want it to come before
  27. self.fields.insert(0,'sender',forms.EmailField(initial=str(time.time())))
  28.  
  29. def move_field_before(form, field, before_field):
  30. content = form.base_fields[field]
  31. del(form.base_fields[field])
  32. insert_at = list(form.base_fields).index(before_field)
  33. form.base_fields.insert(insert_at, field, content)
  34. return form
  35.  
  36. import operator
  37. import itertools
  38.  
  39. class Field(object):
  40. _counter = itertools.count()
  41. def __init__(self):
  42. self.count = Field._counter.next()
  43. self.name = ''
  44. def __repr__(self):
  45. return "Field(%r)" % self.name
  46.  
  47. class MyForm(object):
  48. b = Field()
  49. a = Field()
  50. c = Field()
  51.  
  52. def __init__(self):
  53. self.fields = []
  54. for field_name in dir(self):
  55. field = getattr(self, field_name)
  56. if isinstance(field, Field):
  57. field.name = field_name
  58. self.fields.append(field)
  59. self.fields.sort(key=operator.attrgetter('count'))
  60.  
  61. m = MyForm()
  62. print m.fields # in defined order
  63.  
  64. [Field('b'), Field('a'), Field('c')]
Add Comment
Please, Sign In to add comment