On Thu, May 14, 2009 at 5:26 PM, Margie <margierogin...@yahoo.com> wrote:
>
> Sorry for the length of this - I hope someone knowledgable about ajax
> has a minute to take a look, I've been working on it for awhile.
> George - if you are reading this - this is my attempt to do the jquery/
> ajax that you recommended a few days back when I posted a more general
> question.
>
> Ok - here's the high level: I have a Task model that contains an owner
> field.  In the admin change_list view for the task, I am am trying to
> create a jquery ajax request that will override the queryset for the
> task's owner  field so that it contains the users returned by a GET
> request to  http://mysite.com/admin/taskmanager/task/get_owner_queryse
> /<taskId>.
>
> In other words, I don't want the queryset for owner to contain all
> Users in the system, I want it to just contain the users that are
> specified in the task's 'resources' field, which is a ManyToMany
> field.
>
> Note: all code is also at http://dpaste.com/44241 - more readable
> there.
>
> I'm trying hard to leverage the admin interface, which I think will
> work for me if I can just figure out how to configure it with some
> spiffy jquery/ajax.
>
> I'm doing this by overriding formfield_for_foreignkey () so that it
> uses a special OwnerSelectWidget for the 'owner' field, like this:
>
>
>
>    def formfield_for_foreignkey(self, db_field, request, **kwargs):
>        if db_field.name == "owner":
>            kwargs["widget"] = OwnerSelectWidget()
>            return db_field.formfield(**kwargs)
>        return super(TaskAdmin, self).formfield_for_foreignkey
> (db_field, request, **kwargs)
>
> My OwnerSelectWidget looks like this:
>
> class OwnerSelectWidget(widgets.Select):
>
>    class Media:
>        css = {}
>        js = (
>            'js/jquery.js',
>        )
>
>    def render(self, name, value, attrs=None):
>        rendered = super(OwnerSelectWidget, self).render(name, value,
> attrs)
>        return rendered + mark_safe(u'''
>            <script type="text/javascript">
>                $('#id_%(name)s').mousedown(function() {
>                            $.getJSON("get_owner_queryset/
> NEED_TASK_ID_HERE",
>                                      function(data) {
>                                        var options = '';
>                                        for (var i = 0; i <
> data.length; i++) {
>                                           /* set options based on
> data - not quite sure how */
>                                        $('#id_%(name)s').html
> (options);
>                                      })
>                            })
>            </script>
>            ''' % {'name': name, })
>
> My code that services the GET is in my admin.py file and looks like
> this:
>
> class TaskAdmin(admin.ModelAdmin):
>
>    def __call__(self, request, url):
>        if url is None:
>            pass
>        else:
>            match = re.search('get_owner_queryset/(\d+)', url)
>            if  match:
>                return self.getOwnerQuerySet(match.group(0))
>            else:
>                return super(TaskAdmin, self).__call__(request, url)
>
>    def getOwnerQuerySet(self, taskId):
>        task = Task.objects.get(taskId)
>        resourcesToReturn = task.resources.all() # resources are users
>        return HttpResponse(simplejson.dumps(resourcesToReturn),
> mimetype='application/json')
>
>
> I have a couple problems (so far that I know of).
>
> 1. In line 8 of the render() method, where I have NEED_TASK_ID_HERE,
> I'm trying to figure out how I get the task id.  It seems like at
> this  point in the code  I don't have access to that.  The id is
> output as part of the change_list  form, but it doesn't have an id
> associated with it.  What is the best approach to take?
>
> 2. In getOwnerQuerySet(), I don't think what I'm returning is
> correct.  When I play around in pdb and create a User queryset and
> then try to call simplejson.dumps() on it:
>   resources = User.objects.all()
>   return HttpResponse(simplejson.dumps(resourcesToReturn),
> mimtype='application/json')
> I get the error:
>
>  *** TypeError: [<User: buck>, <User: bob>] is not JSON serializable
>
> So I think I am not really returning the data correctly.  And when I
> run the app
> this way, I get a 500 INTERNAL SERVER ERROR.
>
> 3. Once I do manage to return whatever it is that I'm supposed to
> return (ie,  question 2), I'm not quite sure what it is going to look
> like when it gets back to the jquery callback function.  I have a
> little for loop in there, but I think I need to come up name/value
> pairs.  If the GET is returning a list of user names, where does the
> value come from?
>
>
> Ok - sorry for the length of this but I've been working for awhile now
> on it and could really use some pointers from someone knowledgable out
> there.  I know there is doc on this simplejson stuff, but the first
> time around, it's just hard to make sense of it all.
>
> Margie
> >
>

Re: your second question, you'll want to use django's built in serialization:
http://docs.djangoproject.com/en/dev/topics/serialization/

This nicely handles django models, and you can select a subset of
fields to include, etc.  Instead of your simplejson call, you can use:
serializers.serialize("json", resourcesToReturn)

To take a stab at your third question, JSON is literally a bit of
javascript syntax that gets evaluated (JavaScript Object Notation :).
So from a serialized queryset you'll get (on the javascript side) a
list of objects with field names / data.  So {'foo':'bar'} would give
you a javascript object (call it 'test'), and test.foo == 'bar'.  In
your code you should be able to access an object in your loop with:
item = data[i]
Then try
item.fields.name (if your model field is "name", etc).
It might be helpful to look at a serialized queryset in the shell to
see how the JSON is structured.

Colin

--~--~---------~--~----~------------~-------~--~----~
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