def render_alert(content, alert_type=None, dismissable=True): """ Render a Bootstrap alert """ button = '' if not alert_type: alert_type = 'info' css_classes = ['alert', 'alert-' + text_value(alert_type)] if dismissable: css_classes.append('alert-dismissable fade in') button = """ <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> """ button_placeholder = '__BUTTON__' return mark_safe( render_tag( 'div', attrs={ 'class': ' '.join(css_classes), 'role': 'alert' }, content=button_placeholder + text_value(content), ).replace(button_placeholder, button))
def __init__(self, field, *args, **kwargs): if not isinstance(field, BoundField): raise BootstrapError('Parameter "field" should contain a valid Django BoundField.') self.field = field super(FieldRenderer, self).__init__(*args, **kwargs) self.widget = field.field.widget self.is_multi_widget = isinstance(field.field.widget, MultiWidget) self.initial_attrs = self.widget.attrs.copy() self.field_help = text_value(mark_safe(field.help_text)) if self.show_help and field.help_text else '' self.field_errors = [conditional_escape(text_value(error)) for error in field.errors] if get_bootstrap_setting('set_placeholder'): self.placeholder = field.label else: self.placeholder = '' self.addon_before = kwargs.get('addon_before', self.widget.attrs.pop('addon_before', '')) self.addon_after = kwargs.get('addon_after', self.widget.attrs.pop('addon_after', '')) error_css_class = kwargs.get('error_css_class', None) required_css_class = kwargs.get('required_css_class', None) bound_css_class = kwargs.get('bound_css_class', None) if error_css_class is not None: self.error_css_class = error_css_class else: self.error_css_class = getattr( field.form, 'error_css_class', get_bootstrap_setting('error_css_class')) if required_css_class is not None: self.required_css_class = required_css_class else: self.required_css_class = getattr( field.form, 'required_css_class', get_bootstrap_setting('required_css_class')) if bound_css_class is not None: self.success_css_class = bound_css_class else: self.success_css_class = getattr( field.form, 'bound_css_class', get_bootstrap_setting('success_css_class')) if self.field.form.empty_permitted: self.set_required = False self.required_css_class = '' self.set_disabled = kwargs.get('set_disabled', False)
def get_label_class(self): label_class = self.label_class if not label_class and self.layout == 'horizontal': label_class = self.horizontal_label_class label_class = text_value(label_class) if not self.show_label: label_class = add_css_class(label_class, 'sr-only') return add_css_class(label_class, 'col-form-label')
def render(self): # Hidden input requires no special treatment if self.field.is_hidden: return text_value(self.field) # Render the widget self.add_widget_attrs() html = self.field.as_widget(attrs=self.widget.attrs) return html
def parse_size(self, size): size = text_value(size).lower().strip() if size in ('sm', 'small'): return 'small' if size in ('lg', 'large'): return 'large' if size in ('md', 'medium'): return 'medium' raise BootstrapError('Invalid value "%s" for parameter "size" (expected "sm", "md" "lg" or "").' % size)
def render_button(content, button_type=None, icon=None, button_class='', size='', href='', name=None, value=None, title=None): attrs = {} classes = add_css_class('btn', button_class) size = text_value(size).lower().strip() if size == 'xs': classes = add_css_class(classes, 'btn-xs') elif size == 'sm' or size == 'small': classes = add_css_class(classes, 'btn-sm') elif size == 'lg' or size == 'large': classes = add_css_class(classes, 'btn-lg') elif size == 'md' or size == 'medium': pass elif size: raise BootstrapError( 'Parameter "size" should be "xs", "sm", "lg" or empty ("{}" given).' .format(size)) if button_type: if button_type == 'submit': classes = add_css_class(classes, 'btn-primary') attrs['class'] = 'btn btn-primary' elif button_type == 'reset': attrs['class'] = 'btn btn-warning' elif button_type not in ('reset', 'button', 'link'): raise BootstrapError( 'Parameter "button_type" should be "submit", "reset", "button", "link" or empty ("{}" given).' .format(button_type)) attrs['type'] = button_type icon_content = render_icon(icon) if icon else '' if href: attrs['href'] = href tag = 'a' else: tag = 'button' if name: attrs['name'] = name if value: attrs['value'] = value if title: attrs['title'] = title return render_tag(tag, attrs=attrs, content=mark_safe( text_concat(icon_content, content, separator=' ')))
def render_alert(content, alert_type=None, dismissable=True): """ Render a Bootstrap alert Port from bootstrap4, as it is bit buggy, and don't allow mark_safe """ button = "" if not alert_type: alert_type = "info" css_classes = ["alert", "alert-" + text_value(alert_type)] if dismissable: css_classes.append("alert-dismissable") button = ('<button type="button" class="close" ' + 'data-dismiss="alert" aria-label="{}">×</button>') button = button.format(_("close")) button_placeholder = mark_safe("__BUTTON__") return mark_safe( render_tag( "div", attrs={ "class": " ".join(css_classes), "role": "alert" }, content=button_placeholder + text_value(content), ).replace(button_placeholder, button))
def render_label(content, label_for=None, label_class=None, label_title='', optional=False): """ Render a label with content """ attrs = {} if label_for: attrs['for'] = label_for if label_class: attrs['class'] = label_class if label_title: attrs['title'] = label_title builder = '<{tag}{attrs}>{content}{opt}</{tag}>' return format_html( builder, tag='label', attrs=mark_safe(flatatt(attrs)) if attrs else '', opt=mark_safe('<br><span class="optional">{}</span>'.format(pgettext('form', 'Optional'))) if optional else '', content=text_value(content), )
def _render(self): # See if we're not excluded if self.field.name in self.exclude.replace(' ', '').split(','): return '' # Hidden input requires no special treatment if self.field.is_hidden: return text_value(self.field) # Render the widget self.add_widget_attrs() html = self.field.as_widget(attrs=self.widget.attrs) self.restore_widget_attrs() # Start post render html = self.post_widget_render(html) html = self.wrap_widget(html) html = self.make_input_group(html) html = self.append_to_field(html) html = self.wrap_field(html) html = self.add_label(html) html = self.wrap_label_and_field(html) return html
def render_label(content, label_for=None, label_class=None, label_title="", optional=False): """Render a label with content.""" attrs = {} if label_for: attrs["for"] = label_for if label_class: attrs["class"] = label_class if label_title: attrs["title"] = label_title builder = "<{tag}{attrs}>{content}{opt}</{tag}>" return format_html( builder, tag="label", attrs=mark_safe(flatatt(attrs)) if attrs else "", opt=mark_safe('<br><span class="optional">{}</span>'.format( pgettext("form", "Optional"))) if optional else "", content=text_value(content), )
def test_text_value(self): self.assertEqual(text_value(''), "") self.assertEqual(text_value(' '), " ") self.assertEqual(text_value(None), "") self.assertEqual(text_value(1), "1")
def render_management_form(self): return text_value(self.formset.management_form)