Hi Russell,

I bumped into the same issue today and was glad I found this post.
However, I found that I had to use unicode() rather than str(),
which turns your example into:

content = dict((key, [unicode(v) for v in values]) \
                                        for key, values in
form.errors.items())

With str() the proxy returns '<django.utils.functional.__proxy__
object at 0x83878ac>' (i.e. it only puts the name into quotes)

On Oct 19, 6:14 am, "Russell Keith-Magee" <freakboy3...@gmail.com>
wrote:
> On Sun, Oct 19, 2008 at 12:58 AM, justind <justin.don...@gmail.com> wrote:
>
> > Hello,
>
> > No one has any ideas?
>
> Settle down, Tiger. You asked this question on a Friday night. You may
> need to wait a little more than 18 hours if you want a response.
> We're all volunteers here, and many of us have professional and family
> obligations that take priority over answering questions on a mailing
> list.
>
> To answer your question - although it may not be immediately obvious
> to you _why_ this is occurring, the error message you have received
> does tell you exactly _what_ is occurring.
>
> Although form.errors appears to be a dictionary containing strings
> (i.e., a dictionay of lists of strings appear when you print
> form.errors), it's actually an ErrorDict that contains ValidationError
> objects. These, in turn, are manipulated in various ways to ensure
> correct unicode output - and one of those manipulations is the use of
> proxy objects (django.utils.functional.__proxy__). If you call str()
> on a proxy object, it will evaluate and return the underlying string,
> but the object itself isn't a string.
>
> SimpleJSON (and the Django copy of the SimpleJSON library) only knows
> how to serialized basic Python types, so it complains when you give it
> a proxy object. This use of proxy objects in this way was something
> introduced by the introduction of full unicode support in Django.
> Jacob's slide predate the introduction of feature, which explains why
> the example he gave doesn't work out of the box with a more recent
> Django version.
>
> However, If you force the rollout of the proxy objects before calling
> dumps(), SimpleJSON will correctly encode the form errors. Something
> like:
>
> >>> simplejson.dumps(dict((key,str(v) for v in values) for key,values in 
> >>> form.errors.items())
>
> should do the trick.
>
> Yours,
> Russ Magee %-)
>
> > The code I'm actually using in my view is almost identical to the
> > validage_contact view from
> >http://toys.jacobian.org/presentations/2007/oscon/tutorial/(single
> > slide:http://toys.jacobian.org/presentations/2007/oscon/tutorial/images/dja...)
> > and I'm using the JsonResponse function from those slides as well.
>
> > Has something changed since these were published? Is this a bug?
>
> > On Oct 17, 4:55 pm, "justin.don...@gmail.com"
> > <justin.don...@gmail.com> wrote:
> >> Hello,
>
> >> I'm having a hard time understanding why Django won't let me serialize
> >> a dictionary of form errors. Can anyone explain why Django throws an
> >> error if I try to serialize someform.errors, even if I copy it into a
> >> plain dictionary?
>
> >> #!/usr/bin/env python
> >> from django.utils import simplejson
> >> from project.main.models import SampleForm
>
> >> test = {}
> >> simplejson.dumps(test) # works
>
> >> test = {'key': [u"value"]}
> >> simplejson.dumps(test) # works
>
> >> # suppose SampleForms wants a text and url field
> >> # I just give it a text field to test
> >> form = SampleForm({"text": "sample text"})
> >> d = {} # make a new dictionary
> >> # update d so we're working with a plain dictionary
> >> d.update(f.errors)
> >> type(d) # returns dict
>
> >> # fails: <django.utils.functional.__proxy__ object at 0x00C83810>
> >> # isnotJSONserializable
> >> simplejson.dumps(d)
--~--~---------~--~----~------------~-------~--~----~
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 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to