def save(self):
     """
     saves changes on book object, or creates new
     m2m changes are handled in BookBorm.save_m2m
     returns self.obj
     """
     if not self.obj:
         self.obj = Book(title=unicode(self.title.data))
     else:
         self.obj.title = self.title.data
     return self.obj
class BookForm(Form):
    """
    Form for adding editing Book instances
    """
    title = TextField('title', validators=[Required(), Length(min=1, max=256)])
    authors = AuthorsTagListField('authors')

    def __init__(self, *args, **kwargs):
        self.obj = kwargs.get('obj', None)
        super(BookForm, self).__init__(*args, **kwargs)

    def get_instance(self):
        return self.obj

    def save(self):
        """
        saves changes on book object, or creates new
        m2m changes are handled in BookBorm.save_m2m
        returns self.obj
        """
        if not self.obj:
            self.obj = Book(title=unicode(self.title.data))
        else:
            self.obj.title = self.title.data
        return self.obj

    def save_m2m(self):
        """
        updates authors of book
        returns True if there were some actual changes and book object need to
        be commited
        """
        if self.authors.data:
            ids = set(self.authors.data)
            return self.obj.update_authors(ids)
        return False