Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 14298)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -835,6 +835,14 @@
     def get_internal_type(self):
         return "FilePathField"
 
+class RelativeFilePathField(FilePathField):
+    def formfield(self, **kwargs):
+        defaults = {
+            'form_class': forms.RelativeFilePathField,
+        }
+        defaults.update(kwargs)
+        return super(RelativeFilePathField, self).formfield(**defaults)
+
 class FloatField(Field):
     empty_strings_allowed = False
     default_error_messages = {
Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 14298)
+++ django/forms/fields.py	(working copy)
@@ -40,7 +40,7 @@
     'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
     'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
     'SplitDateTimeField', 'IPAddressField', 'FilePathField', 'SlugField',
-    'TypedChoiceField'
+    'TypedChoiceField', 'RelativeFilePathField'
 )
 
 def en_format(name):
@@ -874,6 +874,14 @@
 
         self.widget.choices = self.choices
 
+class RelativeFilePathField(FilePathField):
+    def __init__(self, path, *args, **kwargs):
+        super(RelativeFilePathField, self).__init__(path, *args, **kwargs)
+        choices = []
+        for choice in self.choices:
+            choices.append((os.path.relpath(choice[0], path), choice[1]))
+        self.choices = choices
+
 class SplitDateTimeField(MultiValueField):
     widget = SplitDateTimeWidget
     hidden_widget = SplitHiddenDateTimeWidget
Index: docs/ref/forms/fields.txt
===================================================================
--- docs/ref/forms/fields.txt	(revision 14298)
+++ docs/ref/forms/fields.txt	(working copy)
@@ -522,6 +522,17 @@
 When you use a ``FileField`` in a form, you must also remember to
 :ref:`bind the file data to the form <binding-uploaded-files>`.
 
+``RelativeFilePathField``
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 1.3
+
+.. class:: RelativeFilePathField(**kwargs)
+
+This field is an extension of the :class:`~django.forms.fields.FilePathField`
+whose choices are relative file paths (as opposed to the absolute file paths
+used by ``FilePathField``).
+
 ``FilePathField``
 ~~~~~~~~~~~~~~~~~
 
Index: docs/ref/models/fields.txt
===================================================================
--- docs/ref/models/fields.txt	(revision 14298)
+++ docs/ref/models/fields.txt	(working copy)
@@ -654,6 +654,26 @@
 created as ``varchar(100)`` columns in your database. As with other fields, you
 can change the maximum length using the :attr:`~CharField.max_length` argument.
 
+The value stored in the database will be the absolute filesystem path to the
+selected file including ``path``. See :class:`RelativeFilePathField` to store
+the relative filesystem path.
+
+``RelativeFilePathField``
+-------------------------
+
+.. class:: RelativeFilePathField(path=None, [match=None, recursive=False, max_length=100, **options])
+
+A :class:`FilePathField` whose values represent relative paths from the
+absolute filesystem path. For example:
+
+    RelativeFilePathField(path="/home/images")
+
+...will store the value "foo.gif" in the database for an image located at
+"/home/images/foo.gif" and "foo/bar.gif" for an image located at
+"/home/images/foo/bar.gif".
+
+See :class:`RelativeFilePathField` to store the absolute filesystem path.
+
 ``FloatField``
 --------------
 
Index: docs/topics/forms/modelforms.txt
===================================================================
--- docs/topics/forms/modelforms.txt	(revision 14298)
+++ docs/topics/forms/modelforms.txt	(working copy)
@@ -65,7 +65,7 @@
 
     ``FileField``                    ``FileField``
 
-    ``FilePathField``                ``CharField``
+    ``FilePathField``                ``SelectField``
 
     ``FloatField``                   ``FloatField``
 
@@ -89,6 +89,8 @@
 
     ``PositiveSmallIntegerField``    ``IntegerField``
 
+    ``RelativeFilePathField``        ``SelectField``
+
     ``SlugField``                    ``SlugField``
 
     ``SmallIntegerField``            ``IntegerField``
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 14298)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -862,3 +862,44 @@
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid time.']", f.clean, ['2006-01-10', ''])
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid time.']", f.clean, ['2006-01-10'])
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Enter a valid date.']", f.clean, ['', '07:30'])
+
+    # RelativeFilePathField #######################################################
+
+    def test_relativefilepathfield_71(self):
+        path = forms.__file__
+        path = os.path.dirname(os.path.abspath(path)) + '/'
+        f = RelativeFilePathField(path=path)
+        f.choices = [p for p in f.choices if p[0].endswith('.py')]
+        f.choices.sort()
+        expected = [
+                ('__init__.py', '__init__.py'),
+                ('fields.py', 'fields.py'),
+                ('forms.py', 'forms.py'),
+                ('formsets.py', 'formsets.py'),
+                ('models.py', 'models.py'),
+                ('util.py', 'util.py'),
+                ('widgets.py', 'widgets.py')
+            ]
+        for exp, got in zip(expected, fix_os_paths(f.choices)):
+            self.assertEqual(exp[1], got[1])
+            self.assertTrue(got[0].endswith(exp[0]))
+
+    def test_relativefilepathfield_72(self):
+        path = os.path.abspath(forms.__file__)
+        path = os.path.dirname(path) + '/'
+        f = FilePathField(path=path, recursive=True, match='^.*?\.py$')
+        f.choices.sort()
+        expected = [
+                ('__init__.py', '__init__.py'),
+                ('extras/__init__.py', 'extras/__init__.py'),
+                ('extras/widgets.py', 'extras/widgets.py'),
+                ('fields.py', 'fields.py'),
+                ('forms.py', 'forms.py'),
+                ('formsets.py', 'formsets.py'),
+                ('models.py', 'models.py'),
+                ('util.py', 'util.py'),
+                ('widgets.py', 'widgets.py')
+            ]
+        for exp, got in zip(expected, fix_os_paths(f.choices)):
+            self.assertEqual(exp[1], got[1])
+            self.assertTrue(got[0].endswith(exp[0]))
