Ticket #6302: pass_initial_through_with_tests_3.diff
File pass_initial_through_with_tests_3.diff, 8.4 KB (added by , 17 years ago) |
---|
-
django/db/models/fields/__init__.py
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 139a096..7bc6c58 100644
a b class FileField(Field): 797 797 return os.path.normpath(f) 798 798 799 799 def save_form_data(self, instance, data): 800 if data: 800 from django.newforms.fields import UploadedFile 801 if data and isinstance(data, UploadedFile): 801 802 getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False) 802 803 803 804 def formfield(self, **kwargs): 804 805 defaults = {'form_class': forms.FileField} 805 # If a file has been provided previously, then the form doesn't require806 # that a new file is provided this time.807 if 'initial' in kwargs:808 defaults['required'] = False809 806 defaults.update(kwargs) 810 807 return super(FileField, self).formfield(**defaults) 811 808 -
django/newforms/fields.py
diff --git a/django/newforms/fields.py b/django/newforms/fields.py index 3b8f419..0761b8f 100644
a b class FileField(Field): 437 437 def __init__(self, *args, **kwargs): 438 438 super(FileField, self).__init__(*args, **kwargs) 439 439 440 def clean(self, data ):441 super(FileField, self).clean( data)440 def clean(self, data, initial=None): 441 super(FileField, self).clean(initial or data) 442 442 if not self.required and data in EMPTY_VALUES: 443 443 return None 444 elif not data and initial: 445 return initial 444 446 try: 445 447 f = UploadedFile(data['filename'], data['content']) 446 448 except TypeError: … … class ImageField(FileField): 456 458 'invalid_image': _(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."), 457 459 } 458 460 459 def clean(self, data ):461 def clean(self, data, initial=None): 460 462 """ 461 463 Checks that the file-upload field data contains a valid image (GIF, JPG, 462 464 PNG, possibly others -- whatever the Python Imaging Library supports). 463 465 """ 464 f = super(ImageField, self).clean(data )466 f = super(ImageField, self).clean(data, initial) 465 467 if f is None: 466 468 return None 467 469 from PIL import Image -
django/newforms/forms.py
diff --git a/django/newforms/forms.py b/django/newforms/forms.py index 556c00a..04bf62e 100644
a b from django.utils.html import escape 9 9 from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode 10 10 from django.utils.safestring import mark_safe 11 11 12 from fields import Field 12 from fields import Field, FileField 13 13 from widgets import TextInput, Textarea 14 14 from util import flatatt, ErrorDict, ErrorList, ValidationError 15 15 … … class BaseForm(StrAndUnicode): 182 182 # widgets split data over several HTML fields. 183 183 value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 184 184 try: 185 value = field.clean(value) 185 if isinstance(field, FileField): 186 initial = self.initial.get(name, field.initial) 187 value = field.clean(value, initial) 188 else: 189 value = field.clean(value) 186 190 self.cleaned_data[name] = value 187 191 if hasattr(self, 'clean_%s' % name): 188 192 value = getattr(self, 'clean_%s' % name)() -
tests/modeltests/model_forms/models.py
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index 17c3b35..ff3f20e 100644
a b examples are probably a poor fit for the ModelForm syntax. In other words, 7 7 most of these tests should be rewritten. 8 8 """ 9 9 10 import os 11 import tempfile 12 10 13 from django.db import models 11 14 12 15 ARTICLE_STATUS = ( … … class PhoneNumber(models.Model): 55 58 def __unicode__(self): 56 59 return self.phone 57 60 61 class TextFile(models.Model): 62 description = models.CharField(max_length=20) 63 file = models.FileField(upload_to=tempfile.gettempdir()) 64 65 def __unicode__(self): 66 return self.description 67 58 68 __test__ = {'API_TESTS': """ 59 69 >>> from django import newforms as forms 60 70 >>> from django.newforms.models import ModelForm … … ValidationError: [u'Select a valid choice. 4 is not one of the available choices 701 711 True 702 712 >>> f.cleaned_data 703 713 {'phone': u'312-555-1212', 'description': u'Assistance'} 714 715 # FileField ################################################################### 716 717 >>> class TextFileForm(ModelForm): 718 ... class Meta: 719 ... model = TextFile 720 721 Test conditions when files is either not given or empty. 722 723 >>> f = TextFileForm(data={'description': u'Assistance'}) 724 >>> f.is_valid() 725 False 726 >>> f = TextFileForm(data={'description': u'Assistance'}, files={}) 727 >>> f.is_valid() 728 False 729 730 Upload a file and ensure it all works as expected. 731 732 >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test1.txt', 'content': 'hello world'}}) 733 >>> f.is_valid() 734 True 735 >>> type(f.cleaned_data['file']) 736 <class 'django.newforms.fields.UploadedFile'> 737 >>> instance = f.save() 738 >>> instance.file 739 u'.../test1.txt' 740 741 Edit an instance that already has the file defined in the model. This will not 742 save the file again, but leave it exactly as it is. 743 744 >>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance) 745 >>> f.is_valid() 746 True 747 >>> f.cleaned_data['file'] 748 u'.../test1.txt' 749 >>> instance = f.save() 750 >>> instance.file 751 u'.../test1.txt' 752 753 Delete the current file since this is not done by Django. 754 755 >>> os.unlink(instance.get_file_filename()) 756 757 Override the file by uploading a new one. 758 759 >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test2.txt', 'content': 'hello world'}}, instance=instance) 760 >>> f.is_valid() 761 True 762 >>> instance = f.save() 763 >>> instance.file 764 u'.../test2.txt' 765 766 >>> instance.delete() 767 768 Test the non-required FileField 769 770 >>> f = TextFileForm(data={'description': u'Assistance'}) 771 >>> f.fields['file'].required = False 772 >>> f.is_valid() 773 True 774 >>> instance = f.save() 775 >>> instance.file 776 '' 777 778 >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test3.txt', 'content': 'hello world'}}, instance=instance) 779 >>> f.is_valid() 780 True 781 >>> instance = f.save() 782 >>> instance.file 783 u'.../test3.txt' 784 >>> instance.delete() 704 785 """} -
tests/regressiontests/forms/fields.py
diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py index cff5db6..9216210 100644
a b Traceback (most recent call last): 749 749 ... 750 750 ValidationError: [u'This field is required.'] 751 751 752 >>> f.clean('', '') 753 Traceback (most recent call last): 754 ... 755 ValidationError: [u'This field is required.'] 756 757 >>> f.clean('', 'files/test1.pdf') 758 'files/test1.pdf' 759 752 760 >>> f.clean(None) 753 761 Traceback (most recent call last): 754 762 ... 755 763 ValidationError: [u'This field is required.'] 756 764 765 >>> f.clean(None, '') 766 Traceback (most recent call last): 767 ... 768 ValidationError: [u'This field is required.'] 769 770 >>> f.clean(None, 'files/test2.pdf') 771 'files/test2.pdf' 772 757 773 >>> f.clean({}) 758 774 Traceback (most recent call last): 759 775 ... 760 776 ValidationError: [u'No file was submitted.'] 761 777 778 >>> f.clean({}, '') 779 Traceback (most recent call last): 780 ... 781 ValidationError: [u'No file was submitted.'] 782 783 >>> f.clean({}, 'files/test3.pdf') 784 'files/test3.pdf' 785 762 786 >>> f.clean('some content that is not a file') 763 787 Traceback (most recent call last): 764 788 ... 765 789 ValidationError: [u'No file was submitted. Check the encoding type on the form.'] 766 790 767 >>> f.clean({'filename': 'name', 'content': None})791 >>> f.clean({'filename': 'name', 'content': None}) 768 792 Traceback (most recent call last): 769 793 ... 770 794 ValidationError: [u'The submitted file is empty.'] 771 795 772 >>> f.clean({'filename': 'name', 'content': ''})796 >>> f.clean({'filename': 'name', 'content': ''}) 773 797 Traceback (most recent call last): 774 798 ... 775 799 ValidationError: [u'The submitted file is empty.'] 776 800 777 >>> type(f.clean({'filename': 'name', 'content':'Some File Content'})) 801 >>> type(f.clean({'filename': 'name', 'content': 'Some File Content'})) 802 <class 'django.newforms.fields.UploadedFile'> 803 804 >>> type(f.clean({'filename': 'name', 'content': 'Some File Content'}, 'files/test4.pdf')) 778 805 <class 'django.newforms.fields.UploadedFile'> 779 806 780 807 # URLField ##################################################################