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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---