2015-07-22 1 views
0

J'essaye d'ajouter à un champ M2M soumis dans un formset. Les enregistrements ajoutés ne sont pas ajoutés. Voici le views.pyAjouter au M2M dans formset

if family_member_formset.is_valid(): 
    for form in family_member_formset: 
     fmform = form.save(commit=False) 
     # This query should return a list of "email lists" that should be 
     # added to the form before it is submitted. 
     matches = fmform.email_list.get_admin() 
     for ae in matches: 
      fmform.email_list.add(ae) 
     fmform.save() 
     form.save_m2m() 

La requête get_admin() renvoie les éléments suivants:

>>> matches 
[<EmailList: Knee-mail>, <EmailList: Student Council>, <EmailList: Co-o>,<EmailList: High School>, <EmailList: General Homeschool Info>] 

Ce que je crois arrive devrait être ceci: - get_admin() récupère les enregistrements que cet utilisateur a enregistré dans la base de données. - ces enregistrements sont ensuite ajoutés au formulaire soumis. - lorsque le formulaire est enregistré, le code M2M supprime tous ces enregistrements. - le code M2M ajoute ensuite tous les enregistrements M2M inclus dans ce formulaire. - puisque j'ai ajouté les enregistrements à get_admin() au formulaire avant qu'il ne soit enregistré, ces enregistrements doivent être ajoutés à la base de données.

Ce que je trouve est que ces enregistrements ne sont pas enregistrés. Tout ce qui est enregistré est la sélection faite par l'utilisateur avant de soumettre le formulaire.

Répondre

0

Résolu.

if family_member_formset.is_valid(): 
     for form in family_member_formset: 
      fmform = form.save(commit=False) 
      matches = fmform.email_list.get_admin().all() 
      # Not sure if I need this but it ensures that 
      # the database records are actually retrieved before 
      # the records are deleted in the save_m2m call 
      elist=[] 
      for e in matches: 
       elist.append(e) 
      fmform.save() 
      form.save_m2m() 
      # Add entries AFTER the M2M records are saved 
      for ae in elist: 
       fmform.email_list.add(ae)