Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 7003)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -814,6 +814,16 @@
         self.path, self.match, self.recursive = path, match, recursive
         kwargs['max_length'] = kwargs.get('max_length', 100)
         Field.__init__(self, verbose_name, name, **kwargs)
+    
+    def formfield(self, **kwargs):
+        defaults = {
+            'path': self.path,
+            'match': self.match,
+            'recursive': self.recursive,
+            'form_class': forms.FilePathField,
+        }
+        defaults.update(kwargs)
+        return super(FilePathField, self).formfield(**defaults)
 
     def get_manipulator_field_objs(self):
         return [curry(oldforms.FilePathField, path=self.path, match=self.match, recursive=self.recursive)]
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 7003)
+++ django/newforms/fields.py	(working copy)
@@ -4,6 +4,7 @@
 
 import copy
 import datetime
+import os
 import re
 import time
 # Python 2.3 fallbacks
@@ -31,7 +32,7 @@
     'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField',
     'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
     'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
-    'SplitDateTimeField', 'IPAddressField',
+    'SplitDateTimeField', 'IPAddressField', 'FilePathField',
 )
 
 # These values, if given to to_python(), will trigger the self.required check.
@@ -750,3 +751,26 @@
 
     def __init__(self, *args, **kwargs):
         super(IPAddressField, self).__init__(ipv4_re, *args, **kwargs)
+
+class FilePathField(ChoiceField):
+    def __init__(self, path, match=None, recursive=False, required=True, widget=Select, label=None, initial=None, help_text=None, *args, **kwargs):
+        self.path, self.match, self.recursive = path, match, recursive
+        super(FilePathField, self).__init__(choices=(), required=required, widget=widget, label=label, initial=initial, help_text=help_text, *args, **kwargs)
+        self.choices = []
+        if self.match is not None:
+            self.match_re = re.compile(self.match)
+        if recursive:
+            for root, dirs, files in os.walk(self.path):
+                for f in files:
+                    if self.match is None or self.match_re.search(f):
+                        f = os.path.join(root, f)
+                        self.choices.append(f, f.replace(self.path, "", 1))
+        else:
+            try:
+                for f in os.listdir(self.path):
+                    full_file = os.path.join(self.path, f)
+                    if os.path.isfile(full_file) and (self.match is None or self.match_re.search(f)):
+                        self.choices.append((full_file, f))
+            except OSError:
+                pass
+        self.widget.choices = self.choices
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 7003)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -1106,6 +1106,25 @@
 >>> f.clean(None)
 u''
 
+# FilePathField ###############################################################
+
+>>> import re
+>>> from django import newforms as forms
+>>> loc = forms.__file__
+>>> m = re.search(r'(.*?)/__init__\..*$', loc)
+>>> loc = m.group(1) + '/'
+>>> loc
+'.../django/newforms/'
+>>> f = forms.FilePathField(path=loc)
+>>> f.choices
+[('.../django/newforms/util.pyc', 'util.pyc'), ('.../django/newforms/forms.py', 'forms.py'), ('.../django/newforms/models.py', 'models.py'), ('.../django/newforms/widgets.py', 'widgets.py'), ('.../django/newforms/__init__.py', '__init__.py'), ('.../django/newforms/fields.pyc', 'fields.pyc'), ('.../django/newforms/widgets.pyc', 'widgets.pyc'), ('.../django/newforms/models.pyc', 'models.pyc'), ('.../django/newforms/util.py', 'util.py'), ('.../django/newforms/fields.py', 'fields.py'), ('.../django/newforms/fields.py~', 'fields.py~'), ('.../django/newforms/forms.pyc', 'forms.pyc'), ('.../django/newforms/__init__.pyc', '__init__.pyc')]
+>>> f.clean('fields.py')
+Traceback (most recent call last):
+...
+django.newforms.util.ValidationError: [u'Select a valid choice. That choice is not one of the available choices.']
+>>> f.clean(loc+'fields.py')
+u'.../django/newforms/fields.py'
+
 # SplitDateTimeField ##########################################################
 
 >>> f = SplitDateTimeField()
Index: docs/newforms.txt
===================================================================
--- docs/newforms.txt	(revision 7003)
+++ docs/newforms.txt	(working copy)
@@ -1345,6 +1345,19 @@
 
 .. _`bind the file data to the form`: `Binding uploaded files to a form`_
 
+``FilePathField``
+~~~~~~~~~~~~~~
+
+**New in Django development version**
+
+    * Default widget: ``Select``
+    * Empty value: ``None``
+    * Normalizes to: A unicode object
+    * Validates that the selected choice exists in the list of choices.
+    * Error message keys: ``required``, ``invalid_choice``
+
+The choices are generated from the filesystem.  They can be forced to match a specific regulat expression(this only matches the file, not the entire path).  It can also be recursive.
+
 ``ImageField``
 ~~~~~~~~~~~~~~
 
