Skip to content

Commit

Permalink
Escape help text in form builder forms by default
Browse files Browse the repository at this point in the history
This can be disabled with the setting WAGTAILFORMS_HELP_TEXT_ALLOW_HTML
  • Loading branch information
gasman committed Jul 20, 2020
1 parent b59a737 commit d9a41e7
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 1 deletion.
13 changes: 13 additions & 0 deletions docs/reference/settings.rst
Expand Up @@ -547,3 +547,16 @@ By default the redirect importer keeps track of the uploaded file as a temp file
.. code-block:: python
WAGTAIL_REDIRECTS_FILE_STORAGE = 'cache'
Form builder
============

.. versionadded:: 2.7.4/2.9.3

The ``WAGTAILFORMS_HELP_TEXT_ALLOW_HTML`` option was added.

.. code-block:: python
WAGTAILFORMS_HELP_TEXT_ALLOW_HTML = True
When true, HTML tags in form field help text will be rendered unescaped (default: False).
7 changes: 6 additions & 1 deletion wagtail/contrib/forms/forms.py
@@ -1,6 +1,8 @@
from collections import OrderedDict

import django.forms
from django.conf import settings
from django.utils.html import conditional_escape
from django.utils.translation import gettext_lazy as _

from wagtail.admin.forms import WagtailAdminPageForm
Expand Down Expand Up @@ -114,7 +116,10 @@ def formfields(self):
def get_field_options(self, field):
options = {}
options['label'] = field.label
options['help_text'] = field.help_text
if getattr(settings, 'WAGTAILFORMS_HELP_TEXT_ALLOW_HTML', False):
options['help_text'] = field.help_text
else:
options['help_text'] = conditional_escape(field.help_text)
options['required'] = field.required
options['initial'] = field.default_value
return options
Expand Down
9 changes: 9 additions & 0 deletions wagtail/contrib/forms/tests/test_models.py
Expand Up @@ -29,9 +29,18 @@ def test_get_form(self):
self.assertTemplateUsed(response, 'tests/form_page.html')
self.assertTemplateNotUsed(response, 'tests/form_page_landing.html')

# HTML in help text should be escaped
self.assertContains(response, "<em>please</em> be polite")

# check that variables defined in get_context are passed through to the template (#1429)
self.assertContains(response, "<p>hello world</p>")

@override_settings(WAGTAILFORMS_HELP_TEXT_ALLOW_HTML=True)
def test_get_form_without_help_text_escaping(self):
response = self.client.get('/contact-us/')
# HTML in help text should not be escaped
self.assertContains(response, "<em>please</em> be polite")

def test_post_invalid_form(self):
response = self.client.post('/contact-us/', {
'your_email': 'bob',
Expand Down
1 change: 1 addition & 0 deletions wagtail/contrib/forms/tests/utils.py
Expand Up @@ -28,6 +28,7 @@ def make_form_page(**kwargs):
label="Your message",
field_type='multiline',
required=True,
help_text="<em>please</em> be polite"
)
FormField.objects.create(
page=form_page,
Expand Down

0 comments on commit d9a41e7

Please sign in to comment.