layout.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from crispy_forms.helper import FormHelper
  2. from crispy_forms.layout import *
  3. from crispy_forms.bootstrap import *
  4. from crispy_forms.utils import render_field, flatatt, TEMPLATE_PACK
  5. from crispy_forms import layout
  6. from crispy_forms import bootstrap
  7. import math
  8. class Fieldset(layout.Fieldset):
  9. template = "xadmin/layout/fieldset.html"
  10. def __init__(self, legend, *fields, **kwargs):
  11. self.description = kwargs.pop('description', None)
  12. self.collapsed = kwargs.pop('collapsed', None)
  13. super(Fieldset, self).__init__(legend, *fields, **kwargs)
  14. class Row(layout.Div):
  15. def __init__(self, *fields, **kwargs):
  16. css_class = 'form-inline form-group'
  17. new_fields = [self.convert_field(f, len(fields)) for f in fields]
  18. super(Row, self).__init__(css_class=css_class, *new_fields, **kwargs)
  19. def convert_field(self, f, counts):
  20. col_class = "col-sm-%d" % int(math.ceil(12 / counts))
  21. if not (isinstance(f, Field) or issubclass(f.__class__, Field)):
  22. f = layout.Field(f)
  23. if f.wrapper_class:
  24. f.wrapper_class += " %s" % col_class
  25. else:
  26. f.wrapper_class = col_class
  27. return f
  28. class Col(layout.Column):
  29. def __init__(self, id, *fields, **kwargs):
  30. css_class = ['column', 'form-column', id, 'col col-sm-%d' %
  31. kwargs.get('span', 6)]
  32. if kwargs.get('horizontal'):
  33. css_class.append('form-horizontal')
  34. super(Col, self).__init__(css_class=' '.join(css_class), *
  35. fields, **kwargs)
  36. class Main(layout.Column):
  37. css_class = "column form-column main col col-sm-9 form-horizontal"
  38. class Side(layout.Column):
  39. css_class = "column form-column sidebar col col-sm-3"
  40. class Container(layout.Div):
  41. css_class = "form-container row clearfix"
  42. # Override bootstrap3
  43. class InputGroup(layout.Field):
  44. template = "xadmin/layout/input_group.html"
  45. def __init__(self, field, *args, **kwargs):
  46. self.field = field
  47. self.inputs = list(args)
  48. if '@@' not in args:
  49. self.inputs.append('@@')
  50. self.input_size = None
  51. css_class = kwargs.get('css_class', '')
  52. if 'input-lg' in css_class:
  53. self.input_size = 'input-lg'
  54. if 'input-sm' in css_class:
  55. self.input_size = 'input-sm'
  56. super(InputGroup, self).__init__(field, **kwargs)
  57. def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs):
  58. classes = form.fields[self.field].widget.attrs.get('class', '')
  59. extra_context = {
  60. 'inputs': self.inputs,
  61. 'input_size': self.input_size,
  62. 'classes': classes.replace('form-control', '')
  63. }
  64. if hasattr(self, 'wrapper_class'):
  65. extra_context['wrapper_class'] = self.wrapper_class
  66. return render_field(
  67. self.field, form, form_style, context, template=self.template,
  68. attrs=self.attrs, template_pack=template_pack, extra_context=extra_context, **kwargs)
  69. class PrependedText(InputGroup):
  70. def __init__(self, field, text, **kwargs):
  71. super(PrependedText, self).__init__(field, text, '@@', **kwargs)
  72. class AppendedText(InputGroup):
  73. def __init__(self, field, text, **kwargs):
  74. super(AppendedText, self).__init__(field, '@@', text, **kwargs)
  75. class PrependedAppendedText(InputGroup):
  76. def __init__(self, field, prepended_text=None, appended_text=None, *args, **kwargs):
  77. super(PrependedAppendedText, self).__init__(
  78. field, prepended_text, '@@', appended_text, **kwargs)