Index: django/newforms/forms.py
===================================================================
--- django/newforms/forms.py	(revision 6268)
+++ django/newforms/forms.py	(working copy)
@@ -212,6 +212,18 @@
         """
         return self.cleaned_data
 
+    def is_multipart(self):
+        """
+        Returns True if the form needs to be multipart-encrypted, i.e. it has
+        FileInput. Otherwise, False.
+        """
+        # python 2.5 syntax
+        # return all(field.widget.needs_multipart_form for field in self.fields.values())
+        for field in self.fields.values():
+            if field.widget.needs_multipart_form:
+                return True
+        return False
+
 class Form(BaseForm):
     "A collection of Fields, plus their associated data."
     # This is a separate class from BaseForm in order to abstract the way
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 6268)
+++ django/newforms/widgets.py	(working copy)
@@ -24,6 +24,7 @@
 
 class Widget(object):
     is_hidden = False          # Determines whether this corresponds to an <input type="hidden">.
+    needs_multipart_form = False # Determines does this widget need multipart-encrypted form
 
     def __init__(self, attrs=None):
         if attrs is not None:
@@ -120,6 +121,7 @@
 
 class FileInput(Input):
     input_type = 'file'
+    needs_multipart_form = True
 
     def render(self, name, value, attrs=None):
         return super(FileInput, self).render(name, None, attrs=attrs)
Index: docs/newforms.txt
===================================================================
--- docs/newforms.txt	(revision 6268)
+++ docs/newforms.txt	(working copy)
@@ -776,6 +776,13 @@
     # Unbound form with a image field
     >>> f = ContactFormWithMugshot()
 
+If you're writing some generic views and templates, you can check 
+that your form needs proper ``enctype`` with the help from ``is_multipart()``::
+
+    >>> f = ContactFormWithMugshot()
+    >>> f.is_multipart()
+    True
+
 Subclassing forms
 -----------------
 
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 6268)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -3856,6 +3856,25 @@
 <div class="errorlist"><div class="error">This field is required.</div></div>
 <p>Comment: <input type="text" name="comment" /></p>
 
+#################################
+# Test multipart-encrypted form #
+#################################
+
+>>> class FormWithoutFile(Form):
+...     username = CharField()
+>>> class FormWithFile(Form):
+...     username = CharField()
+...     file = FileField()
+>>> class FormWithImage(Form):
+...     image = ImageField()
+
+>>> FormWithoutFile().is_multipart()
+False
+>>> FormWithFile().is_multipart()
+True
+>>> FormWithImage().is_multipart()
+True
+
 """
 
 __test__ = {
