Django

Code

Ticket #6302: pass_initial_through_with_tests_3.diff

File pass_initial_through_with_tests_3.diff, 8.4 kB (added by brosner, 1 year ago)

special cased to FileField?

  • a/django/db/models/fields/__init__.py

    old new  
    797797        return os.path.normpath(f) 
    798798 
    799799    def save_form_data(self, instance, data): 
    800         if data: 
     800        from django.newforms.fields import UploadedFile 
     801        if data and isinstance(data, UploadedFile): 
    801802            getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False) 
    802803 
    803804    def formfield(self, **kwargs): 
    804805        defaults = {'form_class': forms.FileField} 
    805         # If a file has been provided previously, then the form doesn't require 
    806         # that a new file is provided this time. 
    807         if 'initial' in kwargs: 
    808             defaults['required'] = False 
    809806        defaults.update(kwargs) 
    810807        return super(FileField, self).formfield(**defaults) 
    811808 
  • a/django/newforms/fields.py

    old new  
    437437    def __init__(self, *args, **kwargs): 
    438438        super(FileField, self).__init__(*args, **kwargs) 
    439439 
    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) 
    442442        if not self.required and data in EMPTY_VALUES: 
    443443            return None 
     444        elif not data and initial: 
     445            return initial 
    444446        try: 
    445447            f = UploadedFile(data['filename'], data['content']) 
    446448        except TypeError: 
     
    456458        'invalid_image': _(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."), 
    457459    } 
    458460 
    459     def clean(self, data): 
     461    def clean(self, data, initial=None): 
    460462        """ 
    461463        Checks that the file-upload field data contains a valid image (GIF, JPG, 
    462464        PNG, possibly others -- whatever the Python Imaging Library supports). 
    463465        """ 
    464         f = super(ImageField, self).clean(data
     466        f = super(ImageField, self).clean(data, initial
    465467        if f is None: 
    466468            return None 
    467469        from PIL import Image 
  • a/django/newforms/forms.py

    old new  
    99from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode 
    1010from django.utils.safestring import mark_safe 
    1111 
    12 from fields import Field 
     12from fields import Field, FileField 
    1313from widgets import TextInput, Textarea 
    1414from util import flatatt, ErrorDict, ErrorList, ValidationError 
    1515 
     
    182182            # widgets split data over several HTML fields. 
    183183            value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) 
    184184            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) 
    186190                self.cleaned_data[name] = value 
    187191                if hasattr(self, 'clean_%s' % name): 
    188192                    value = getattr(self, 'clean_%s' % name)() 
  • a/tests/modeltests/model_forms/models.py

    old new  
    77most of these tests should be rewritten. 
    88""" 
    99 
     10import os 
     11import tempfile 
     12 
    1013from django.db import models 
    1114 
    1215ARTICLE_STATUS = ( 
     
    5558    def __unicode__(self): 
    5659        return self.phone 
    5760 
     61class 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 
    5868__test__ = {'API_TESTS': """ 
    5969>>> from django import newforms as forms 
    6070>>> from django.newforms.models import ModelForm 
     
    701711True 
    702712>>> f.cleaned_data 
    703713{'phone': u'312-555-1212', 'description': u'Assistance'} 
     714 
     715# FileField ################################################################### 
     716 
     717>>> class TextFileForm(ModelForm): 
     718...     class Meta: 
     719...         model = TextFile 
     720 
     721Test conditions when files is either not given or empty. 
     722 
     723>>> f = TextFileForm(data={'description': u'Assistance'}) 
     724>>> f.is_valid() 
     725False 
     726>>> f = TextFileForm(data={'description': u'Assistance'}, files={}) 
     727>>> f.is_valid() 
     728False 
     729 
     730Upload 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() 
     734True 
     735>>> type(f.cleaned_data['file']) 
     736<class 'django.newforms.fields.UploadedFile'> 
     737>>> instance = f.save() 
     738>>> instance.file 
     739u'.../test1.txt' 
     740 
     741Edit an instance that already has the file defined in the model. This will not 
     742save the file again, but leave it exactly as it is. 
     743 
     744>>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance) 
     745>>> f.is_valid() 
     746True 
     747>>> f.cleaned_data['file'] 
     748u'.../test1.txt' 
     749>>> instance = f.save() 
     750>>> instance.file 
     751u'.../test1.txt' 
     752 
     753Delete the current file since this is not done by Django. 
     754 
     755>>> os.unlink(instance.get_file_filename()) 
     756 
     757Override 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() 
     761True 
     762>>> instance = f.save() 
     763>>> instance.file 
     764u'.../test2.txt' 
     765 
     766>>> instance.delete() 
     767 
     768Test the non-required FileField 
     769 
     770>>> f = TextFileForm(data={'description': u'Assistance'}) 
     771>>> f.fields['file'].required = False 
     772>>> f.is_valid() 
     773True 
     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() 
     780True 
     781>>> instance = f.save() 
     782>>> instance.file 
     783u'.../test3.txt' 
     784>>> instance.delete() 
    704785"""} 
  • a/tests/regressiontests/forms/fields.py

    old new  
    749749... 
    750750ValidationError: [u'This field is required.'] 
    751751 
     752>>> f.clean('', '') 
     753Traceback (most recent call last): 
     754... 
     755ValidationError: [u'This field is required.'] 
     756 
     757>>> f.clean('', 'files/test1.pdf') 
     758'files/test1.pdf' 
     759 
    752760>>> f.clean(None) 
    753761Traceback (most recent call last): 
    754762... 
    755763ValidationError: [u'This field is required.'] 
    756764 
     765>>> f.clean(None, '') 
     766Traceback (most recent call last): 
     767... 
     768ValidationError: [u'This field is required.'] 
     769 
     770>>> f.clean(None, 'files/test2.pdf') 
     771'files/test2.pdf' 
     772 
    757773>>> f.clean({}) 
    758774Traceback (most recent call last): 
    759775... 
    760776ValidationError: [u'No file was submitted.'] 
    761777 
     778>>> f.clean({}, '') 
     779Traceback (most recent call last): 
     780... 
     781ValidationError: [u'No file was submitted.'] 
     782 
     783>>> f.clean({}, 'files/test3.pdf') 
     784'files/test3.pdf' 
     785 
    762786>>> f.clean('some content that is not a file') 
    763787Traceback (most recent call last): 
    764788... 
    765789ValidationError: [u'No file was submitted. Check the encoding type on the form.'] 
    766790 
    767 >>> f.clean({'filename': 'name', 'content':None}) 
     791>>> f.clean({'filename': 'name', 'content': None}) 
    768792Traceback (most recent call last): 
    769793... 
    770794ValidationError: [u'The submitted file is empty.'] 
    771795 
    772 >>> f.clean({'filename': 'name', 'content':''}) 
     796>>> f.clean({'filename': 'name', 'content': ''}) 
    773797Traceback (most recent call last): 
    774798... 
    775799ValidationError: [u'The submitted file is empty.'] 
    776800 
    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')) 
    778805<class 'django.newforms.fields.UploadedFile'> 
    779806 
    780807# URLField ##################################################################