Django Forms - change the render multiple select widget

Posted by John on Stack Overflow See other posts from Stack Overflow or by John
Published on 2010-05-17T10:35:52Z Indexed on 2010/05/17 10:40 UTC
Read the original article Hit count: 409

Hi,

In my model I have a manytomany field

mentors = models.ManyToManyField(MentorArea, verbose_name='Areas', blank=True)

In my form I want to render this as:

  1. drop down box with list of all MentorArea objects which has not been associated with the object.

  2. Next to that an add button which will call a javascript function which will add it to the object.

  3. Then under that a ul list which has each selected MentorArea object with a x next to it which again calls a javascript function which will remove the MentorArea from the object.

I know that to change how an field element is rendered you create a custom widget and override the render function and I have done that to create the add button.

class AreaWidget(widgets.Select):

    def render(self, name, value, attrs=None, choices=()):
        jquery = u'''
        <input class="button def" type="button" value="Add" id="Add Area" />'''

        output = super(AreaWidget, self).render(name, value, attrs, choices)

        return output + mark_safe(jquery) 

However I don't know how to list the currently selected ones underneath as a list. Can anyone help me? Also what is the best way to filter down the list so that it only shows MentorArea objects which have not been added? I currently have the field as

mentors = forms.ModelMultipleChoiceField(queryset=MentorArea.objects.all(), widget = AreaWidget, required=False)

but this shows all mentors no matter if they have been added or not.

Thanks

© Stack Overflow or respective owner

Related posts about django

Related posts about django-forms