2010-05-17 9 views
1

Dans mon modèle, j'ai un champ ManyToManyDjango Forms - changer le rendu multiple widget de sélection

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

Dans ma forme, je veux rendre ce que:

  1. menu déroulant avec la liste des tous les objets MentorArea qui n'ont pas été associés à l'objet .

  2. À côté de cela, un bouton ajouter va appeler une fonction javascript qui va l'ajouter à l'objet.

  3. Puis sous cette liste ul qui a chaque objet MentorArea sélectionné avec un x à côté de lui qui appelle à nouveau une fonction javascript qui supprimer le MentorArea de l'objet .

Je sais que pour changer la façon dont un élément de champ est rendu vous créez un widget personnalisé et passer outre la fonction rendu et je l'ai fait que pour créer le bouton Ajouter.

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) 

Cependant, je ne sais pas comment lister les sous-titres actuellement sélectionnés sous forme de liste. Quelqu'un peut-il m'aider? Aussi quel est le meilleur moyen de filtrer la liste afin qu'elle ne montre que les objets MentorArea qui n'ont pas été ajoutés? J'ai actuellement le champ comme

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

mais cela montre tous les mentors, qu'ils aient été ajoutés ou non.

Merci

Répondre

1

Pour moi, la fonctionnalité que vous avez décrit ressemble beaucoup à ce que vous pouvez réaliser avec l'aide filter_horizontal et filter_vertical paramètres du ModelAdmin. Le widget qu'ils affichent apparaît dans django.contrib.admin.widgets.FilteredSelectMultiple. Vous devriez jeter un oeil à son code!