Created
November 18, 2014 09:06
-
-
Save sttwister/47e8edff51aaea23e17b to your computer and use it in GitHub Desktop.
Disable crispy-forms automatic field rendering
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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