Search code examples
djangodjango-modelsdjango-formsdjango-viewsmany-to-many

django ManyToManyField save


There's form with many fields (Date, Char, Text, Image, URL...) and they works fine. I mean values are submitted to DB as they must. But when I added ManyToManyField, it didn't save the value of this MultipleChoice form to DB. Any ideas why?

models.py:

class EventTag(models.Model):
    tags = models.CharField(max_length=300)

    def __str__(self):
        return self.tags

class Article(models.Model):
    source = models.CharField(max_length=100)
    source_img = models.ImageField(default='default.png', blank=True)
    #other fields
    event_tags = models.ManyToManyField(EventTag, blank=True)

forms.py:

class CreateArticle(forms.ModelForm):
    class Meta:
        model = models.Article
        fields = ['source', 'source_img', 'event_tags', ]

views.py:

def article_create(request):
    if request.method == 'POST':
        form = forms.CreateArticle(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.author = request.user
            instance.save()
            return redirect('articles:list')
    else:
        form = forms.CreateArticle()
    return render(request, 'articles/article_create.html', { 'form': form })

Solution

  • after save your form you must call form.save_m2m(). your view must be like this:

    def article_create(request):
        if request.method == 'POST':
            form = forms.CreateArticle(request.POST, request.FILES)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.author = request.user
                instance.save()
                form.save_m2m()
                return redirect('articles:list')
        else:
            form = forms.CreateArticle()
        return render(request, 'articles/article_create.html', { 'form': form })