Skip to content

Instantly share code, notes, and snippets.

@sttwister
Created November 18, 2014 09:06
Show Gist options
  • Save sttwister/47e8edff51aaea23e17b to your computer and use it in GitHub Desktop.
Save sttwister/47e8edff51aaea23e17b to your computer and use it in GitHub Desktop.
Disable crispy-forms automatic field rendering
from django.utils.safestring import mark_safe
from crispy_forms import helper
from crispy_forms.utils import TEMPLATE_PACK, render_field
original_render_layout = helper.FormHelper.render_layout
def new_render_layout(self, form, context, template_pack=TEMPLATE_PACK):
"""
Returns safe html of the rendering of the layout.
Monkey patched so that unmentioned layout fields not present in
Meta.fields DO NOT get rendered automatically.
"""
form.rendered_fields = set()
form.crispy_field_template = self.field_template
# This renders the specifed Layout strictly
html = self.layout.render(
form,
self.form_style,
context,
template_pack=template_pack
)
# Rendering some extra fields if specified
if self.render_unmentioned_fields or self.render_hidden_fields or self.render_required_fields:
fields = set(form.fields.keys())
left_fields_to_render = fields - form.rendered_fields
for field in left_fields_to_render:
if (
self.render_unmentioned_fields or
self.render_hidden_fields and form.fields[field].widget.is_hidden or
self.render_required_fields and form.fields[field].widget.is_required
):
html += render_field(
field,
form,
self.form_style,
context,
template_pack=template_pack
)
#
# NOTE: The following code is omitted by monkey-patching.
# Why the hell can you not disable this behaviour?
#
# If the user has Meta.fields defined, not included in the layout,
# we suppose they need to be rendered
#if hasattr(form, 'Meta'):
# if hasattr(form.Meta, 'fields'):
# current_fields = set(getattr(form, 'fields', []))
# meta_fields = set(getattr(form.Meta, 'fields'))
# fields_to_render = current_fields & meta_fields
# left_fields_to_render = fields_to_render - form.rendered_fields
# for field in left_fields_to_render:
# html += render_field(field, form, self.form_style, context)
return mark_safe(html)
helper.FormHelper.render_layout = new_render_layout
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment