From 3bf29d21847ae4d32f7a1d6ec2f205ef3a58efc1 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 1 Dec 2005 06:36:47 +0000 Subject: [PATCH] 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 --- AUTHORS | 1 + django/views/generic/create_update.py | 57 ++++++++++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/AUTHORS b/AUTHORS index c13223e91cf..1c5db7f90ae 100644 --- a/AUTHORS +++ b/AUTHORS @@ -58,6 +58,7 @@ answer newbie questions, and generally made Django that much better: lakin.wecker@gmail.com Stuart Langridge Eugene Lazutkin + limodou Martin Maney Maniac Manuzhai diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py index af853a9f4e8..87f78c5930f 100644 --- a/django/views/generic/create_update.py +++ b/django/views/generic/create_update.py @@ -1,18 +1,18 @@ from django import models from django.core.xheaders import populate_xheaders -from django.core import template_loader, formfields +from django.core import template_loader, formfields, meta from django.views.auth.login import redirect_to_login from django.core.extensions import DjangoContext as Context from django.core.paginator import ObjectPaginator, InvalidPage from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect from django.core.exceptions import Http404, ObjectDoesNotExist, ImproperlyConfigured -def create_object(request, app_label, module_name, template_name=None, - template_loader=template_loader, extra_context={}, +def create_object(request, app_label, module_name, template_name=None, + template_loader=template_loader, extra_context={}, post_save_redirect=None, login_required=False, follow=None): """ Generic object-creation function. - + Templates: ``/_form`` Context: form @@ -20,24 +20,27 @@ def create_object(request, app_label, module_name, template_name=None, """ if login_required and request.user.is_anonymous(): return redirect_to_login(request.path) - + mod = models.get_module(app_label, module_name) manipulator = mod.AddManipulator(follow=follow) if request.POST: # If data was POSTed, we're trying to create a new object new_data = request.POST.copy() - + + if mod.Klass._meta.has_field_type(meta.FileField): + new_data.update(request.FILES) + # Check for errors errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) - + if not errors: # No errors -- this means we can save the data! new_object = manipulator.save(new_data) - + if not request.user.is_anonymous(): request.user.add_message("The %s was created sucessfully." % mod.Klass._meta.verbose_name) - + # Redirect to the new object: first by trying post_save_redirect, # then by obj.get_absolute_url; fail if neither works. if post_save_redirect: @@ -50,7 +53,7 @@ def create_object(request, app_label, module_name, template_name=None, # No POST, so we want a brand new form without any data or errors errors = {} new_data = manipulator.flatten_data() - + # Create the FormWrapper, template, context, response form = formfields.FormWrapper(manipulator, new_data, errors) if not template_name: @@ -62,13 +65,13 @@ def create_object(request, app_label, module_name, template_name=None, for key, value in extra_context.items(): if callable(value): c[key] = value() - else: + else: c[key] = value return HttpResponse(t.render(c)) -def update_object(request, app_label, module_name, object_id=None, slug=None, +def update_object(request, app_label, module_name, object_id=None, slug=None, slug_field=None, template_name=None, template_loader=template_loader, - extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None, + extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None, login_required=False, follow=None): """ Generic object-update function. @@ -84,7 +87,7 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, return redirect_to_login(request.path) mod = models.get_module(app_label, module_name) - + # Look up the object to be edited lookup_kwargs = {} if object_id: @@ -98,16 +101,16 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, object = mod.get_object(**lookup_kwargs) except ObjectDoesNotExist: raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs)) - + manipulator = mod.ChangeManipulator(object.id, follow=follow) - + if request.POST: new_data = request.POST.copy() errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) if not errors: manipulator.save(new_data) - + if not request.user.is_anonymous(): request.user.add_message("The %s was updated sucessfully." % mod.Klass._meta.verbose_name) @@ -122,7 +125,7 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, errors = {} # This makes sure the form acurate represents the fields of the place. new_data = manipulator.flatten_data() - + form = formfields.FormWrapper(manipulator, new_data, errors) if not template_name: 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, for key, value in extra_context.items(): if callable(value): c[key] = value() - else: + else: c[key] = value response = HttpResponse(t.render(c)) populate_xheaders(request, response, app_label, module_name, getattr(object, object._meta.pk.name)) return response -def delete_object(request, app_label, module_name, post_delete_redirect, - object_id=None, slug=None, slug_field=None, template_name=None, - template_loader=template_loader, extra_lookup_kwargs={}, +def delete_object(request, app_label, module_name, post_delete_redirect, + object_id=None, slug=None, slug_field=None, template_name=None, + template_loader=template_loader, extra_lookup_kwargs={}, extra_context={}, login_required=False): """ Generic object-delete function. - - The given template will be used to confirm deletetion if this view is + + The given template will be used to confirm deletetion if this view is fetched using GET; for safty, deletion will only be performed if this view is POSTed. @@ -160,7 +163,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect, return redirect_to_login(request.path) mod = models.get_module(app_label, module_name) - + # Look up the object to be edited lookup_kwargs = {} if object_id: @@ -174,7 +177,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect, object = mod.get_object(**lookup_kwargs) except ObjectDoesNotExist: raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs)) - + if request.META['REQUEST_METHOD'] == 'POST': object.delete() if not request.user.is_anonymous(): @@ -190,7 +193,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect, for key, value in extra_context.items(): if callable(value): c[key] = value() - else: + else: c[key] = value response = HttpResponse(t.render(c)) populate_xheaders(request, response, app_label, module_name, getattr(object, object._meta.pk.name))