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