Saving ManyToMany Relationships

In order to save ManyToMany relationships of model (e.g. data tags of an entry), the respective clean field method of the model form can be overwritten like this: ::

nano models.py
from django.db import models


class Tag(models.Mode):
    name = models.CharField(max_lengt=20)

class Entry(models.Model):
    title = models.CharField(max_length=100)
    date = models.DateField()
    tags = models.ManyToManyField(Tag)


nano forms.py
from django.forms import models

from models import Entry, Tag


class EntryForm(models.ModelForm):

    def clean_tags(self):
        tags = self.cleaned_data.get('tags', None)
        clean_tags = []
        tags = [tag.sprit() for tag in tags.split(',') if tags]
        for tag in tags:
            t, created = Tag.objects.get_or_create(title=tag)
            t.count = F('count') + 1
            t.user.add(self.cleaned_data['user'])
            t.save()
            clean_tags.append(t)
        return clean_tags

    class meta:
        model = Entry

Alternatively the model form save method an be overwritten if super is called: ::

nano models.py
...
def save(self, commit=True):
    tags = []
    for t in self.cleaned_data['tags'].split(','):
        tags.append(Tag.objects.get_or_create(name=t)[0])
    e = super(EntryForm, self).save(commit=commit)
    for t in tags:
        e.tags.add(t)
m2m.png/
Edit tutorial

Comment on This Data Unit