Skip to content

Commit 3bf29d2

Browse files
Fixed #816 -- FileFields now work in the create_update generic view. Thanks, limodou
git-svn-id: http://code.djangoproject.com/svn/django/trunk@1519 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 9ede371 commit 3bf29d2

File tree

2 files changed

+31
-27
lines changed

2 files changed

+31
-27
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ answer newbie questions, and generally made Django that much better:
5858
5959
Stuart Langridge <http://www.kryogenix.org/>
6060
Eugene Lazutkin <http://lazutkin.com/blog/>
61+
limodou
6162
Martin Maney <http://www.chipy.org/Martin_Maney>
6263
Maniac <http://www.softwaremaniacs.org/>
6364
Manuzhai

django/views/generic/create_update.py

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,46 @@
11
from django import models
22
from django.core.xheaders import populate_xheaders
3-
from django.core import template_loader, formfields
3+
from django.core import template_loader, formfields, meta
44
from django.views.auth.login import redirect_to_login
55
from django.core.extensions import DjangoContext as Context
66
from django.core.paginator import ObjectPaginator, InvalidPage
77
from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect
88
from django.core.exceptions import Http404, ObjectDoesNotExist, ImproperlyConfigured
99

10-
def create_object(request, app_label, module_name, template_name=None,
11-
template_loader=template_loader, extra_context={},
10+
def create_object(request, app_label, module_name, template_name=None,
11+
template_loader=template_loader, extra_context={},
1212
post_save_redirect=None, login_required=False, follow=None):
1313
"""
1414
Generic object-creation function.
15-
15+
1616
Templates: ``<app_label>/<module_name>_form``
1717
Context:
1818
form
1919
the form wrapper for the object
2020
"""
2121
if login_required and request.user.is_anonymous():
2222
return redirect_to_login(request.path)
23-
23+
2424
mod = models.get_module(app_label, module_name)
2525
manipulator = mod.AddManipulator(follow=follow)
2626
if request.POST:
2727
# If data was POSTed, we're trying to create a new object
2828
new_data = request.POST.copy()
29-
29+
30+
if mod.Klass._meta.has_field_type(meta.FileField):
31+
new_data.update(request.FILES)
32+
3033
# Check for errors
3134
errors = manipulator.get_validation_errors(new_data)
3235
manipulator.do_html2python(new_data)
33-
36+
3437
if not errors:
3538
# No errors -- this means we can save the data!
3639
new_object = manipulator.save(new_data)
37-
40+
3841
if not request.user.is_anonymous():
3942
request.user.add_message("The %s was created sucessfully." % mod.Klass._meta.verbose_name)
40-
43+
4144
# Redirect to the new object: first by trying post_save_redirect,
4245
# then by obj.get_absolute_url; fail if neither works.
4346
if post_save_redirect:
@@ -50,7 +53,7 @@ def create_object(request, app_label, module_name, template_name=None,
5053
# No POST, so we want a brand new form without any data or errors
5154
errors = {}
5255
new_data = manipulator.flatten_data()
53-
56+
5457
# Create the FormWrapper, template, context, response
5558
form = formfields.FormWrapper(manipulator, new_data, errors)
5659
if not template_name:
@@ -62,13 +65,13 @@ def create_object(request, app_label, module_name, template_name=None,
6265
for key, value in extra_context.items():
6366
if callable(value):
6467
c[key] = value()
65-
else:
68+
else:
6669
c[key] = value
6770
return HttpResponse(t.render(c))
6871

69-
def update_object(request, app_label, module_name, object_id=None, slug=None,
72+
def update_object(request, app_label, module_name, object_id=None, slug=None,
7073
slug_field=None, template_name=None, template_loader=template_loader,
71-
extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None,
74+
extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None,
7275
login_required=False, follow=None):
7376
"""
7477
Generic object-update function.
@@ -84,7 +87,7 @@ def update_object(request, app_label, module_name, object_id=None, slug=None,
8487
return redirect_to_login(request.path)
8588

8689
mod = models.get_module(app_label, module_name)
87-
90+
8891
# Look up the object to be edited
8992
lookup_kwargs = {}
9093
if object_id:
@@ -98,16 +101,16 @@ def update_object(request, app_label, module_name, object_id=None, slug=None,
98101
object = mod.get_object(**lookup_kwargs)
99102
except ObjectDoesNotExist:
100103
raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs))
101-
104+
102105
manipulator = mod.ChangeManipulator(object.id, follow=follow)
103-
106+
104107
if request.POST:
105108
new_data = request.POST.copy()
106109
errors = manipulator.get_validation_errors(new_data)
107110
manipulator.do_html2python(new_data)
108111
if not errors:
109112
manipulator.save(new_data)
110-
113+
111114
if not request.user.is_anonymous():
112115
request.user.add_message("The %s was updated sucessfully." % mod.Klass._meta.verbose_name)
113116

@@ -122,7 +125,7 @@ def update_object(request, app_label, module_name, object_id=None, slug=None,
122125
errors = {}
123126
# This makes sure the form acurate represents the fields of the place.
124127
new_data = manipulator.flatten_data()
125-
128+
126129
form = formfields.FormWrapper(manipulator, new_data, errors)
127130
if not template_name:
128131
template_name = "%s/%s_form" % (app_label, module_name)
@@ -134,20 +137,20 @@ def update_object(request, app_label, module_name, object_id=None, slug=None,
134137
for key, value in extra_context.items():
135138
if callable(value):
136139
c[key] = value()
137-
else:
140+
else:
138141
c[key] = value
139142
response = HttpResponse(t.render(c))
140143
populate_xheaders(request, response, app_label, module_name, getattr(object, object._meta.pk.name))
141144
return response
142145

143-
def delete_object(request, app_label, module_name, post_delete_redirect,
144-
object_id=None, slug=None, slug_field=None, template_name=None,
145-
template_loader=template_loader, extra_lookup_kwargs={},
146+
def delete_object(request, app_label, module_name, post_delete_redirect,
147+
object_id=None, slug=None, slug_field=None, template_name=None,
148+
template_loader=template_loader, extra_lookup_kwargs={},
146149
extra_context={}, login_required=False):
147150
"""
148151
Generic object-delete function.
149-
150-
The given template will be used to confirm deletetion if this view is
152+
153+
The given template will be used to confirm deletetion if this view is
151154
fetched using GET; for safty, deletion will only be performed if this
152155
view is POSTed.
153156
@@ -160,7 +163,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect,
160163
return redirect_to_login(request.path)
161164

162165
mod = models.get_module(app_label, module_name)
163-
166+
164167
# Look up the object to be edited
165168
lookup_kwargs = {}
166169
if object_id:
@@ -174,7 +177,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect,
174177
object = mod.get_object(**lookup_kwargs)
175178
except ObjectDoesNotExist:
176179
raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs))
177-
180+
178181
if request.META['REQUEST_METHOD'] == 'POST':
179182
object.delete()
180183
if not request.user.is_anonymous():
@@ -190,7 +193,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect,
190193
for key, value in extra_context.items():
191194
if callable(value):
192195
c[key] = value()
193-
else:
196+
else:
194197
c[key] = value
195198
response = HttpResponse(t.render(c))
196199
populate_xheaders(request, response, app_label, module_name, getattr(object, object._meta.pk.name))

0 commit comments

Comments
 (0)