Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixed #5387 -- Added is_multipart method to forms. Original patch fro…
…m Petr Marhhoun. Tests and documentation from Murkt.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6273 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Sep 15, 2007
1 parent 32ed883 commit f0cd172
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 0 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -195,6 +195,7 @@ answer newbie questions, and generally made Django that much better:
Martin Maney <http://www.chipy.org/Martin_Maney>
masonsimon+django@gmail.com
Manuzhai
Petr Marhoun <petr.marhoun@gmail.com>
Petar Marić <http://www.petarmaric.com/>
Nuno Mariz <nmariz@gmail.com>
Marijn Vriens <marijn@metronomo.cl>
Expand Down
10 changes: 10 additions & 0 deletions django/newforms/forms.py
Expand Up @@ -212,6 +212,16 @@ def clean(self):
"""
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.
"""
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
Expand Down
2 changes: 2 additions & 0 deletions django/newforms/widgets.py
Expand Up @@ -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:
Expand Down Expand Up @@ -120,6 +121,7 @@ def value_from_datadict(self, data, files, name):

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)
Expand Down
21 changes: 21 additions & 0 deletions docs/newforms.txt
Expand Up @@ -776,6 +776,27 @@ form data *and* file data::
# Unbound form with a image field
>>> f = ContactFormWithMugshot()

Testing for multipart forms
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you're writing some reusable views or templates, you may not know ahead of
time whether your form is a multipart form or not. The ``is_multipart()``
method tells you if the form requires multipart encoding for submission::

>>> f = ContactFormWithMugshot()
>>> f.is_multipart()
True

In a template, this sort of code could be useful::

{% if form.is_multipart %}
<form enctype="multipart/form-data" method="post" action="/foo/">
{% else %}
<form method="post" action="/foo/">
{% endif %}
{% form %}
</form>

Subclassing forms
-----------------

Expand Down
19 changes: 19 additions & 0 deletions tests/regressiontests/forms/tests.py
Expand Up @@ -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-encoded 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__ = {
Expand Down

0 comments on commit f0cd172

Please sign in to comment.