mirror of
https://github.com/django/django.git
synced 2025-10-24 22:26:08 +00:00
Fixed #5893 -- Added a flag to FilePathField to allow listing folders, in addition to regular files. Thank you to Brian Rosner, for encouraging me to first contribute to Django 4 years ago.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17925 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -909,10 +909,11 @@ class MultiValueField(Field):
|
||||
raise NotImplementedError('Subclasses must implement this method.')
|
||||
|
||||
class FilePathField(ChoiceField):
|
||||
def __init__(self, path, match=None, recursive=False, required=True,
|
||||
widget=None, label=None, initial=None, help_text=None,
|
||||
*args, **kwargs):
|
||||
def __init__(self, path, match=None, recursive=False, allow_files=True,
|
||||
allow_folders=False, required=True, widget=None, label=None,
|
||||
initial=None, help_text=None, *args, **kwargs):
|
||||
self.path, self.match, self.recursive = path, match, recursive
|
||||
self.allow_files, self.allow_folders = allow_files, allow_folders
|
||||
super(FilePathField, self).__init__(choices=(), required=required,
|
||||
widget=widget, label=label, initial=initial, help_text=help_text,
|
||||
*args, **kwargs)
|
||||
@@ -927,15 +928,23 @@ class FilePathField(ChoiceField):
|
||||
|
||||
if recursive:
|
||||
for root, dirs, files in sorted(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(path, "", 1)))
|
||||
if self.allow_files:
|
||||
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(path, "", 1)))
|
||||
if self.allow_folders:
|
||||
for f in dirs:
|
||||
if self.match is None or self.match_re.search(f):
|
||||
f = os.path.join(root, f)
|
||||
self.choices.append((f, f.replace(path, "", 1)))
|
||||
else:
|
||||
try:
|
||||
for f in sorted(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)):
|
||||
if (((self.allow_files and os.path.isfile(full_file)) or
|
||||
(self.allow_folders and os.path.isdir(full_file))) and
|
||||
(self.match is None or self.match_re.search(f))):
|
||||
self.choices.append((full_file, f))
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user