1 | Index: django/db/models/fields/__init__.py
|
---|
2 | ===================================================================
|
---|
3 | --- django/db/models/fields/__init__.py (revision 4457)
|
---|
4 | +++ django/db/models/fields/__init__.py (working copy)
|
---|
5 | @@ -660,6 +660,11 @@
|
---|
6 | f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.basename(filename)))
|
---|
7 | return os.path.normpath(f)
|
---|
8 |
|
---|
9 | + def formfield(self, **kwargs):
|
---|
10 | + defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'widget':forms.FileInput}
|
---|
11 | + defaults.update(kwargs)
|
---|
12 | + return forms.FileField(**defaults)
|
---|
13 | +
|
---|
14 | class FilePathField(Field):
|
---|
15 | def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
|
---|
16 | self.path, self.match, self.recursive = path, match, recursive
|
---|
17 | Index: django/newforms/models.py
|
---|
18 | ===================================================================
|
---|
19 | --- django/newforms/models.py (revision 4457)
|
---|
20 | +++ django/newforms/models.py (working copy)
|
---|
21 | @@ -13,6 +13,7 @@
|
---|
22 |
|
---|
23 | This method is created for any form_for_model Form.
|
---|
24 | """
|
---|
25 | + from django.db import models
|
---|
26 | if self.errors:
|
---|
27 | raise ValueError("The %s could not be created because the data didn't validate." % self._model._meta.object_name)
|
---|
28 | return save_instance(self, self._model(), commit)
|
---|
29 | @@ -33,11 +34,20 @@
|
---|
30 | for f in opts.fields:
|
---|
31 | if isinstance(f, models.AutoField):
|
---|
32 | continue
|
---|
33 | + if isinstance(f,models.FileField):
|
---|
34 | + continue
|
---|
35 | setattr(instance, f.attname, clean_data[f.name])
|
---|
36 | if commit:
|
---|
37 | instance.save()
|
---|
38 | for f in opts.many_to_many:
|
---|
39 | setattr(instance, f.attname, clean_data[f.name])
|
---|
40 | +
|
---|
41 | + for f in opts.fields:
|
---|
42 | + if isinstance(f, models.FileField):
|
---|
43 | + file_data = clean_data[f.name][0]
|
---|
44 | + if file_data is not None:
|
---|
45 | + func = getattr(instance,'save_%s_file' % f.name)
|
---|
46 | + func(file_data['filename'], file_data['content'])
|
---|
47 | # GOTCHA: If many-to-many data is given and commit=False, the many-to-many
|
---|
48 | # data will be lost. This happens because a many-to-many options cannot be
|
---|
49 | # set on an object until after it's saved. Maybe we should raise an
|
---|
50 | Index: django/newforms/fields.py
|
---|
51 | ===================================================================
|
---|
52 | --- django/newforms/fields.py (revision 4457)
|
---|
53 | +++ django/newforms/fields.py (working copy)
|
---|
54 | @@ -10,7 +10,7 @@
|
---|
55 | import time
|
---|
56 |
|
---|
57 | __all__ = (
|
---|
58 | - 'Field', 'CharField', 'IntegerField',
|
---|
59 | + 'Field', 'CharField', 'FileField', 'IntegerField',
|
---|
60 | 'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
|
---|
61 | 'DEFAULT_TIME_INPUT_FORMATS', 'TimeField',
|
---|
62 | 'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField',
|
---|
63 | @@ -107,6 +107,14 @@
|
---|
64 | if self.max_length is not None and isinstance(widget, (TextInput, PasswordInput)):
|
---|
65 | return {'maxlength': str(self.max_length)}
|
---|
66 |
|
---|
67 | +class FileField(Field):
|
---|
68 | + def __init__(self,required=True,widget=None,label=None,initial=None):
|
---|
69 | + super(FileField,self).__init__(required,widget,label,initial)
|
---|
70 | +
|
---|
71 | + def clean(self, value):
|
---|
72 | + super(FileField,self).clean(value)
|
---|
73 | + return value
|
---|
74 | +
|
---|
75 | class IntegerField(Field):
|
---|
76 | def __init__(self, max_value=None, min_value=None, *args, **kwargs):
|
---|
77 | self.max_value, self.min_value = max_value, min_value
|
---|
78 | Index: django/newforms/widgets.py
|
---|
79 | ===================================================================
|
---|
80 | --- django/newforms/widgets.py (revision 4457)
|
---|
81 | +++ django/newforms/widgets.py (working copy)
|
---|
82 | @@ -107,6 +107,22 @@
|
---|
83 |
|
---|
84 | class FileInput(Input):
|
---|
85 | input_type = 'file'
|
---|
86 | +
|
---|
87 | + def render(self,name,value,attrs=None,choices=()):
|
---|
88 | + if value is None: value = ''
|
---|
89 | + file_attrs = self.build_attrs(attrs, type='file',name=name+'_file')
|
---|
90 | + final_attrs = self.build_attrs(attrs, type='hidden', name=name)
|
---|
91 | + if value != '': final_attrs['value'] = smart_unicode(value) # only add the value attribute if a value is non-empty
|
---|
92 | +
|
---|
93 | + if value != '':
|
---|
94 | + currently = u'Currently: %s<br/>Change: ' % smart_unicode(value)
|
---|
95 | + else:
|
---|
96 | + currently = u''
|
---|
97 | +
|
---|
98 | + return u'%s<input %s /> <input%s />' % (currently,flatatt(file_attrs),flatatt(final_attrs))
|
---|
99 | +
|
---|
100 | + def value_from_datadict(self,data,name):
|
---|
101 | + return [data.get(name+'_file',None),data.get(name,None)]
|
---|
102 |
|
---|
103 | class Textarea(Widget):
|
---|
104 | def render(self, name, value, attrs=None):
|
---|