diff --git a/django/forms/fields.py b/django/forms/fields.py index 9c4084450aec6..bd4f3d4a8052c 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -829,9 +829,15 @@ def __init__(self, path, match=None, recursive=False, required=True, super(FilePathField, self).__init__(choices=(), required=required, widget=widget, label=label, initial=initial, help_text=help_text, *args, **kwargs) - self.choices = [] + + if self.required: + self.choices = [] + else: + 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: @@ -846,6 +852,7 @@ def __init__(self, path, match=None, recursive=False, required=True, self.choices.append((full_file, f)) except OSError: pass + self.widget.choices = self.choices class SplitDateTimeField(MultiValueField): diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py index dedbed717923a..fc587202d647a 100644 --- a/tests/regressiontests/model_forms_regress/models.py +++ b/tests/regressiontests/model_forms_regress/models.py @@ -1,3 +1,4 @@ +import os from django.db import models from django import forms @@ -12,6 +13,9 @@ def __unicode__(self): class Meta: unique_together = (('left', 'middle'), ('middle', 'right')) +class FilePathModel(models.Model): + path = models.FilePathField(path=os.path.dirname(__file__), match=".*\.py$", blank=True) + __test__ = {'API_TESTS': """ When the same field is involved in multiple unique_together constraints, we need to make sure we don't remove the data for it before doing all the @@ -28,5 +32,14 @@ class Meta: >>> form = TripleForm({'left': '1', 'middle': '3', 'right': '1'}) >>> form.is_valid() True + +# Regression test for #8842: FilePathField(blank=True) +>>> class FPForm(forms.ModelForm): +... class Meta: +... model = FilePathModel + +>>> form = FPForm() +>>> [c[1] for c in form['path'].field.choices] +['---------', '__init__.py', 'models.py'] """}