Add template filters to support widgets that implement render_with_errors

This commit is contained in:
Matt Westcott 2015-02-12 14:04:27 +00:00
parent b912655298
commit 31966eab4f
2 changed files with 26 additions and 2 deletions

View file

@ -4,7 +4,7 @@
<div class="field-content"> <div class="field-content">
<div class="input {{ input_classes }} "> <div class="input {{ input_classes }} ">
{% block form_field %} {% block form_field %}
{{ field }} {{ field|render_with_errors }}
{% endblock %} {% endblock %}
{# This span only used on rare occasions by certain types of input #} {# This span only used on rare occasions by certain types of input #}
@ -14,7 +14,7 @@
<p class="help">{{ field.help_text }}</p> <p class="help">{{ field.help_text }}</p>
{% endif %} {% endif %}
{% if field.errors %} {% if field|has_unrendered_errors %}
<p class="error-message"> <p class="error-message">
{% for error in field.errors %} {% for error in field.errors %}
<span>{{ error|escape }}</span> <span>{{ error|escape }}</span>

View file

@ -150,3 +150,27 @@ class EscapeScriptNode(template.Node):
return cls(nodelist) return cls(nodelist)
register.tag(EscapeScriptNode.TAG_NAME, EscapeScriptNode.handle) register.tag(EscapeScriptNode.TAG_NAME, EscapeScriptNode.handle)
# Helpers for Widget.render_with_errors, our extension to the Django widget API that allows widgets to
# take on the responsibility of rendering their own error messages
@register.filter
def render_with_errors(bound_field):
"""
Usage: {{ field|render_with_errors }} as opposed to {{ field }}.
If the field (a BoundField instance) has errors on it, and the associated widget implements
a render_with_errors method, call that; otherwise, call the regular widget rendering mechanism.
"""
widget = bound_field.field.widget
if bound_field.errors and hasattr(widget, 'render_with_errors'):
return widget.render_with_errors(bound_field.html_name, bound_field.value(), attrs={'id': bound_field.auto_id}, errors=bound_field.errors)
else:
return bound_field.as_widget()
@register.filter
def has_unrendered_errors(bound_field):
"""
Return true if this field has errors that were not accounted for by render_with_errors, because
the widget does not support the render_with_errors method
"""
return bound_field.errors and not hasattr(bound_field.field.widget, 'render_with_errors')