web-dev-qa-db-fra.com

Comment ajouter des données dans le champ ManyToMany?

Je ne le trouve nulle part, donc votre aide sera gentille pour moi :) Voici ce champ:

categories = models.ManyToManyField(fragmentCategory)

Catégorie de fragment:

class fragmentCategory(models.Model):

        CATEGORY_CHOICES = (
                        ('val1', 'value1'),
                        ('val2', 'value2'),
                        ('val3', 'value3'),
                        )

        name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)

Voici le formulaire à envoyer:

<input type="checkbox" name="val1" />
<input type="checkbox" name="val2" />
<input type="checkbox" name="val3" />

J'ai essayé quelque chose comme ça:

categories = fragmentCategory.objects.get(id=1),

Ou:

categories = [1,2]
62
IProblemFactory

Il y a toute une page de la documentation Django consacrée à cela , bien indexée depuis la page de contenu.

Comme l'indique cette page, vous devez faire:

my_obj.categories.add(fragmentCategory.objects.get(id=1))

ou

my_obj.categories.create(name='val1')
110
Daniel Roseman

Dans le cas où quelqu'un d'autre se retrouverait ici à avoir du mal à personnaliser le formulaire d'enregistrement Many2Many, vous ne pouvez pas appeler self.instance.my_m2m.add(obj) dans votre ModelForm.save remplacer, comme ModelForm.save remplit plus tard votre m2m à partir de self.cleaned_data['my_m2m'] qui écrase vos modifications. Appelez plutôt:

my_m2ms = list(self.cleaned_data['my_m2ms'])
my_m2ms.extend(my_custom_new_m2ms)
self.cleaned_data['my_m2ms'] = my_m2ms

(Il est correct de convertir le QuerySet entrant en liste - le ManyToManyField le fait quand même.)

0
Chris