diff --git a/hshassets/forms/utils.py b/hshassets/forms/utils.py index 31a1cf0b903133b0e4e4988991ce1bc281e61222..daa637c012ea36777a15d3d9c97e04b1c2e6f50e 100644 --- a/hshassets/forms/utils.py +++ b/hshassets/forms/utils.py @@ -27,7 +27,13 @@ def render_form_field(field, label=''): out = label_or_not(BulmaFieldMarkup.with_icons(field, field.as_widget())) elif input_type and getattr(BulmaFieldMarkup, input_type, None): # something else explicitly defined - out = getattr(BulmaFieldMarkup, input_type)(field, field.as_widget()) + allow_multiple_selected = getattr(field.field.widget, 'allow_multiple_selected', False) + if input_type == 'checkbox' and allow_multiple_selected: + # Checkboxes for multi select have common label above and checkboxes + # with label of choice option. + out = label_or_not(BulmaFieldMarkup.div_control(field.as_widget())) + else: + out = getattr(BulmaFieldMarkup, input_type)(field, field.as_widget()) else: # fallback default out = label_or_not(BulmaFieldMarkup.div_control(field.as_widget())) @@ -48,7 +54,11 @@ class BulmaFieldMarkup(object): """Bulma requires to wrap every input field with this <div class="field">""" args_generator = ([str(e)] for e in field.errors) error_tags = format_html_join(str(), '<p class="help is-danger">{0}</p>', args_generator) - return format_html('<div class="field">{}{}</div>', content, error_tags) + if field.help_text: + help_tags = format_html('<p class=help>{}</p>', mark_safe(field.help_text)) + else: + help_tags = '' + return format_html('<div class="field">{}{}{}</div>', content, error_tags, help_tags) @classmethod def div_control(cls, content, control_class='control'): @@ -105,6 +115,7 @@ class BulmaFieldMarkup(object): """Checkboxes are super special, they wrap the input field with the label""" return cls.div_control(cls.label(mark_safe(content + ' ' + str(field.label)), css_class='checkbox')) + @classmethod def radio(cls, field, content): choice_markup = '' @@ -128,14 +139,14 @@ def render_form_generics( rendered_errors, rendered_submit_button, submit_only_once=True, - form_id='' + form_id='', ): csrf_field = defaulttags.CsrfTokenNode().render(context) submit_only_once = "true" if submit_only_once else "false" form_icon = None form_id = 'id={}'.format(form_id) if form_id else '' return format_html( - """ + f""" <form method="post" {form_id} data-submit-only-once="{submit_only_once}"> {csrf_field} {rendered_errors} diff --git a/hshassets/templatetags/bulma.py b/hshassets/templatetags/bulma.py index b2daafbc638b51fbbdb9d5da7fbfd6179974e011..0d2d35bf7a94063eaa685cb938389696fed12f7f 100644 --- a/hshassets/templatetags/bulma.py +++ b/hshassets/templatetags/bulma.py @@ -63,13 +63,20 @@ def bulma_form( submit_class="button is-outlined", submit_icon="fas fa-check", submit_only_once=True, - form_id='' + form_id='', ): """Renders whole form, including errors, csrf and a submit button.""" fields = bulma_form_fields(form) errors = bulma_form_errors(form) submit = bulma_submit_button(text=submit_text, css_class=submit_class, icon=submit_icon) - return render_form_generics(context, fields, errors, submit, submit_only_once, form_id) + return render_form_generics( + context, + fields, + errors, + submit, + submit_only_once, + form_id, + ) def render_layout(elements, form): diff --git a/setup.py b/setup.py index 0120713bdd81422629dab3c593817accc3e6a4fd..249ff9f94039bdb9935309685ec07bd28c83b2d0 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-hshassets', - version='2.2.18', + version='2.2.21', packages=find_packages(), include_package_data=True, license='MIT License',