2009-11-03 9 views
0

J'ai un formulaire modèle pour lequel j'écris un widget personnalisé afin de remplacer les formulaires many-to-many. Sélectionnez plusieurs champs avec des widgets jQuery FCBKcomplete. Alors que le remplacement de l'élément multisélect fonctionne correctement, il ne tire plus les options pour le multiselect.Extension de formulaires.SélectionnezMultiple sans perdre de valeurs

Voici mon widget:

class FCBKcompleteWidget(forms.SelectMultiple): 
    def _media(self): 
     return forms.Media(js=(reverse('appstatic', 
             args=['js/jquery.fcbkcomplete.min.js']), 
           reverse('appstatic', 
             args=['js/init-fcbkcomplete.js'])), 
          css={'all': (reverse('appstatic', 
               args=['css/jquery.fcbkcomplete' 
                 '.css']),)}) 

    media = property(_media) 

Voici ma forme:

class BlogForm(forms.ModelForm): 
    class Meta(object): 
     model = models.Blog 
     exclude = ('slug',) 

    def __init__(self, *args, **kwargs): 
     super(BlogForm, self).__init__(*args, **kwargs) 
     self.fields['description'].widget = TinyMCEWidget() 

     fcbkcomplete_fields = ['categories', 'admins', 'editors'] 

     for field in fcbkcomplete_fields: 
      self.fields[field].widget = FCBKcompleteWidget() 

Voici mes modèles:

class Category(models.Model): 
    """A blog category""" 

    title = models.CharField(max_length=128) 
    slug = models.SlugField() 

    class Meta(object): 
     verbose_name_plural = u'Categories' 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('category',(), {'slug': self.slug}) 


class Blog(models.Model): 
    """A blog""" 

    title = models.CharField(max_length=128) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 
    categories = models.ManyToManyField(Category, related_name='blogs') 
    shared = models.BooleanField() 
    admins = models.ManyToManyField(User, related_name='blog_admins') 
    editors = models.ManyToManyField(User, related_name='blog_editors') 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('blog',(), {'slug': self.slug}) 

Voici le résultat HTML:

<div class="field"> 
    <label for="name">Categories</label> 
    <select multiple="multiple" name="categories" id="id_categories"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 
<div class="field"> 
    <label for="name">Admins</label> 
    <select multiple="multiple" name="admins" id="id_admins"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 
<div class="field"> 
    <label for="name">Editors</label> 
    <select multiple="multiple" name="editors" id="id_editors"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 

Comme vous pouvez le voir, aucune des options ne le fait dans l'élément multiselect. Voici le résultat HTML quand je ne remplace pas le widget avec mon habitude un:

<div class="field"> 
    <label for="name">Categories</label> 
    <select multiple="multiple" name="categories" id="id_categories"> 
    <option value="1" selected="selected">Good Stuff</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 
<div class="field"> 
    <label for="name">Admins</label> 
    <select multiple="multiple" name="admins" id="id_admins"> 
    <option value="2" selected="selected">username</option> 
    <option value="3">some username</option> 
    <option value="4">another username</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 
<div class="field"> 
    <label for="name">Editors</label> 
    <select multiple="multiple" name="editors" id="id_editors"> 
    <option value="2" selected="selected">username</option> 
    <option value="3">some username</option> 
    <option value="4">another username</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 

Quelqu'un at-il des suggestions quant à la raison pour laquelle les options qu'il ne font pas à travers le processus de remplacement widget? Toute aide serait grandement appréciée.

+0

Étant donné que vos formulaires sont une ModelForm, le modèle de code serait utile. – stefanw

+0

Ajout des modèles. Merci. –

+0

avez-vous résolu cela? J'ai un problème similaire. –

Répondre

0

1 an est passé, mais la réponse peut être utile même avec la version django actuelle.

Raison de ce comportement semble manquer propriété Choices for fcbk champs il suffit de pousser des choix au formulaire

class EmailSubscriptionFilterForm(forms.ModelForm): 

    class Meta: 
     model = EmailSubscription 
     exclude = ('dsts',) 

    def loc_name(self, id): 
     return Location.objects.get(id = id).name   

    def __init__(self, *args, **kwargs): 
     super(EmailSubscriptionFilterForm, self).__init__(*args, **kwargs) 
     fcbkcomplete_fields = ['orgs'] 
     for field in fcbkcomplete_fields: 
      self.fields[field].widget = MultiOriginSelect() 
     if args: 
      self.fields['orgs'].choices = ([(int(o), self.loc_name(int(o))) for o in args[0].getlist('orgs')]) 

à init, il ajoutera toutes les options qui sont entrées à la demande POST au corps de sélection.

Questions connexes