Hi all!

I try to reimplement django generic create_object and update_object
using newforms and formtools.preview. But I get some problems with
HttpResponseRedirect (can't redirect from model_post_save sub, but
why?) and preview (got strange errors).

When I try to use preview when I create an object I get this:

Traceback (most recent call last):
  File "/home/sector119/devel/django_src/django/core/servers/
basehttp.py", line 277, in run
    self.result = application(self.environ, self.start_response)
  File "/home/sector119/devel/django_src/django/core/servers/
basehttp.py", line 619, in __call__
    return self.application(environ, start_response)
  File "/home/sector119/devel/django_src/django/core/handlers/
wsgi.py", line 209, in __call__
    response = middleware_method(request, response)
  File "/home/sector119/devel/django_src/django/middleware/locale.py",
line 21, in process_response
    patch_vary_headers(response, ('Accept-Language',))
  File "/home/sector119/devel/django_src/django/utils/cache.py", line
129, in patch_vary_headers
    if response.has_header('Vary'):
AttributeError: 'ModelFormPreviewClass' object has no attribute
'has_header'

# here is create_object  view

from django.core.exceptions import ImproperlyConfigured
#from django.core.urlresolvers import reverse
from django.template import loader, RequestContext
from django.contrib.auth.views import redirect_to_login
from django.http import HttpResponse, HttpResponseRedirect
from django.newforms import ModelForm
#from django.shortcuts import get_object_or_404

from django.contrib.auth.decorators import login_required

from django.utils.translation import ugettext as _

def create_object(request, model, template_name=None,
template_loader=loader, extra_context=None, post_save_redirect=None,
login_required=False, model_form=None, context_processors=None,
preview=False):
    """
    Generic object-creation function.

    Templates: ``<app_label>/<model_name>_form.html``
    Context:
        form
            the form wrapper for the object
    """
    # FIXME: 'model' variable is rewriting somewhere in the
ModelFormClass class. But where?
    model_ = model

    if extra_context is None:
        extra_context = {}

    if login_required and not request.user.is_authenticated():
        return redirect_to_login(request.path)

    if model_form is None:
        class ModelFormClass(ModelForm):
            class Meta:
                model = model_
        model_form = ModelFormClass

    def model_post_save():
        if request.user.is_authenticated():
            request.user.message_set.create(message=_("The %(verbose_name)s
was created successfully.") % {"verbose_name":
model_._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:
            return HttpResponseRedirect(post_save_redirect %
new_object.__dict__)
        elif hasattr(new_object, 'get_absolute_url'):
            return HttpResponseRedirect(new_object.get_absolute_url())
        else:
            raise ImproperlyConfigured("No URL to redirect to from generic
create view.")

    # preview
    # AND HERE WE GOT AN ERROR!!!
    if preview:
        from django.contrib.formtools.preview import FormPreview
        class ModelFormPreviewClass(FormPreview):
            def done(self, request, cleaned_data):
                new_object = model_.objects.create(**cleaned_data)
                model_post_save()
        return ModelFormPreviewClass(model_form)

    if request.method == 'POST':
        if not request.FILES:
            form = model_form(request.POST)
        else:
            form = model_form(request.POST, request.FILES)
        if form.is_valid():
            # No errors -- this means we can save the data!
            new_object = form.save()
# This work fine!
#           if post_save_redirect:
#               return HttpResponseRedirect(post_save_redirect %
new_object.__dict__)

# But here, using model_post_save function I can't redirect, nothing
is happen
            model_post_save()
    else:
        form = model_form()

    if not template_name:
        template_name = "%s/%s_form.html" % (model_._meta.app_label,
model_._meta.object_name.lower())
    t = template_loader.get_template(template_name)
    c = RequestContext(request, { 'form': form }, context_processors)
    for key, value in extra_context.items():
        if callable(value):
            c[key] = value()
        else:
            c[key] = value
    return HttpResponse(t.render(c))


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to