Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 6658)
+++ 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.
@@ -755,3 +756,28 @@
 
     def __init__(self, *args, **kwargs):
         super(IPAddressField, self).__init__(ipv4_re, *args, **kwargs)
+        
+class FilePathField(ChoiceField):
+    """A ChoiceField whose choices are files or folders from the filesystem"""
+    
+    def __init__(self, path, match=None, recursive=False, required=True, widget=None, 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
