From 307eef20e35e78b1e812dc347c6c959e380267cf Mon Sep 17 00:00:00 2001
From: Erik Romijn <eromijn@solidlinks.nl>
Date: Sat, 23 Aug 2014 10:27:33 +0200
Subject: [PATCH] [1.7.x] Fixed #23075 -- Added documentation on novalidate
 attribute and made it default for admin

Backport of cbdda28208c9c2aea479d5a482ff27bf37869d34 from master.
---
 django/contrib/admin/templates/admin/change_form.html |  2 +-
 django/contrib/admin/templates/admin/change_list.html |  2 +-
 docs/topics/forms/index.txt                           | 10 ++++++++++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html
index d68f71ebd3..7c7100f848 100644
--- a/django/contrib/admin/templates/admin/change_form.html
+++ b/django/contrib/admin/templates/admin/change_form.html
@@ -37,7 +37,7 @@
   </ul>
 {% endif %}{% endif %}
 {% endblock %}
-<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
 <div>
 {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
 {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}
diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html
index 586942d174..ca0080e3be 100644
--- a/django/contrib/admin/templates/admin/change_list.html
+++ b/django/contrib/admin/templates/admin/change_list.html
@@ -81,7 +81,7 @@
         {% endif %}
       {% endblock %}
 
-      <form id="changelist-form" action="" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
+      <form id="changelist-form" action="" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %} novalidate>{% csrf_token %}
       {% if cl.formset %}
         <div>{{ cl.formset.management_form }}</div>
       {% endif %}
diff --git a/docs/topics/forms/index.txt b/docs/topics/forms/index.txt
index 857ffaad34..49a0f15c2f 100644
--- a/docs/topics/forms/index.txt
+++ b/docs/topics/forms/index.txt
@@ -345,6 +345,16 @@ from that ``{{ form }}`` by Django's template language.
     directly tied to forms in templates, this tag is omitted from the
     following examples in this document.
 
+.. admonition:: HTML5 input types and browser validation
+
+    If your form includes a :class:`~django.forms.URLField`, an
+    :class:`~django.forms.EmailField` or any integer field type, Django will
+    use the ``url``, ``email`` and ``number`` HTML5 input types. By default,
+    browsers may apply their own validation on these fields, which may be
+    stricter than Django's validation. If you would like to disable this
+    behavior, set the `novalidate` attribute on the ``form`` tag, or specify
+    a different widget on the field, like :class:`TextInput`.
+
 We now have a working web form, described by a Django :class:`Form`, processed
 by a view, and rendered as an HTML ``<form>``.