2009-12-02 2 views
2

J'ai un modèle de calendrier et dans un formulaire je veux être capable de créer plusieurs instances de celui-ci.comment puis-je enregistrer un formulaire avec ModelMultipleChoiceField?

Voici mes modèles:

class Event(models.Model): 
    user = models.ForeignKey(User) 

class Group(models.Model): 
    name = models.CharField(_('Name'), max_length=80) 
    events = models.ManyToManyField(Event, through='Calendar') 

class Calendar(models.Model): 
    event = models.ForeignKey(Event) 
    group = models.ForeignKey(Group) 

class CalendarInline(admin.TabularInline): 
    model = Calendar 
    extra = 1 

class GroupAdmin(admin.ModelAdmin): 
    inlines = (CalendarInline,) 

Voici comment j'essaie de coder ma forme:

class AddEventToGroupForm(ModelForm): 
    group = ModelMultipleChoiceField(queryset=Group.objects.all(), widget=SelectMultiple()) 

    def save(self): 
     for g in self: 
      g.save() 

    class Meta: 
     model = Calendar 
     fields = ('group',) 

Et est ici une partie de mon avis:

e = Event.objects.get(id=event_id) 
calentry = Calendar(event=e) 
if request.POST: 
    f = AddEventToGroupForm(data=request.POST, instance=calentry) 
    if f.is_valid(): 
     f.save() 

Si J'essaie de soumettre ce formulaire, je reçois:

AttributeError at /groups/add_event/7/ 

'BoundField' object has no attribute 'save' 

Quelle est la bonne façon de créer plusieurs instances de calendrier dans cette situation ?

Répondre

2

Ce n'est pas comment gérer les relations plusieurs-à-plusieurs dans les formulaires. Vous ne pouvez pas parcourir des champs dans un formulaire et les enregistrer, cela ne fonctionne vraiment pas de cette façon.

Dans ce formulaire, il n'y a qu'un seul champ qui possède plusieurs valeurs. La chose à faire ici est de parcourir les valeurs de ce champ, que vous trouverez dans le dictionnaire cleaned_data (lorsque le formulaire est valide).

Alors, selon vous, vous faites quelque chose comme:

if f.is_valid(): 
    for group in f.cleaned_data['group']: 
     calentry.groups.add(group) 

Notez que vous n'êtes pas « sauver » la forme AddEventToGroupForm du tout. Je voudrais en faire une forme standard. Formulaire, plutôt que ModelForm, car vous ne dépendez pas vraiment de la fonctionnalité ModelForm.

Questions connexes