Changeset 7021
- Timestamp:
- 01/17/08 12:03:21 (6 months ago)
- Files:
-
- django/trunk/django/db/models/fields/__init__.py (modified) (2 diffs)
- django/trunk/django/newforms/fields.py (modified) (2 diffs)
- django/trunk/django/newforms/forms.py (modified) (2 diffs)
- django/trunk/tests/modeltests/model_forms/models.py (modified) (3 diffs)
- django/trunk/tests/regressiontests/forms/fields.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/db/models/fields/__init__.py
r6935 r7021 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 … … 805 806 # If a file has been provided previously, then the form doesn't require 806 807 # that a new file is provided this time. 808 # The code to mark the form field as not required is used by 809 # form_for_instance, but can probably be removed once form_for_instance 810 # is gone. ModelForm uses a different method to check for an existing file. 807 811 if 'initial' in kwargs: 808 812 defaults['required'] = False django/trunk/django/newforms/fields.py
r6875 r7021 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']) … … 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 django/trunk/django/newforms/forms.py
r6671 r7021 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 … … 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): django/trunk/tests/modeltests/model_forms/models.py
r6917 r7021 7 7 most of these tests should be rewritten. 8 8 """ 9 10 import os 11 import tempfile 9 12 10 13 from django.db import models … … 55 58 def __unicode__(self): 56 59 return self.phone 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 57 67 58 68 __test__ = {'API_TESTS': """ … … 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 """} django/trunk/tests/regressiontests/forms/fields.py
r6746 r7021 751 751 ValidationError: [u'This field is required.'] 752 752 753 >>> f.clean(None) 754 Traceback (most recent call last): 755 ... 756 ValidationError: [u'This field is required.'] 753 >>> f.clean('', '') 754 Traceback (most recent call last): 755 ... 756 ValidationError: [u'This field is required.'] 757 758 >>> f.clean('', 'files/test1.pdf') 759 'files/test1.pdf' 760 761 >>> f.clean(None) 762 Traceback (most recent call last): 763 ... 764 ValidationError: [u'This field is required.'] 765 766 >>> f.clean(None, '') 767 Traceback (most recent call last): 768 ... 769 ValidationError: [u'This field is required.'] 770 771 >>> f.clean(None, 'files/test2.pdf') 772 'files/test2.pdf' 757 773 758 774 >>> f.clean({}) … … 761 777 ValidationError: [u'No file was submitted.'] 762 778 779 >>> f.clean({}, '') 780 Traceback (most recent call last): 781 ... 782 ValidationError: [u'No file was submitted.'] 783 784 >>> f.clean({}, 'files/test3.pdf') 785 'files/test3.pdf' 786 763 787 >>> f.clean('some content that is not a file') 764 788 Traceback (most recent call last): … … 766 790 ValidationError: [u'No file was submitted. Check the encoding type on the form.'] 767 791 768 >>> f.clean({'filename': 'name', 'content': None})792 >>> f.clean({'filename': 'name', 'content': None}) 769 793 Traceback (most recent call last): 770 794 ... 771 795 ValidationError: [u'The submitted file is empty.'] 772 796 773 >>> f.clean({'filename': 'name', 'content': ''})797 >>> f.clean({'filename': 'name', 'content': ''}) 774 798 Traceback (most recent call last): 775 799 ... 776 800 ValidationError: [u'The submitted file is empty.'] 777 801 778 >>> type(f.clean({'filename': 'name', 'content':'Some File Content'})) 802 >>> type(f.clean({'filename': 'name', 'content': 'Some File Content'})) 803 <class 'django.newforms.fields.UploadedFile'> 804 805 >>> type(f.clean({'filename': 'name', 'content': 'Some File Content'}, 'files/test4.pdf')) 779 806 <class 'django.newforms.fields.UploadedFile'> 780 807
