Models in a Simple PyMongo-based Blogging Web App without ORM/ODM
For the route I'd probably use fewer temporary variables, not that it
hurts a lot, but it can be more compact.  Additionally if Post
implemented some sort of dict-like update function it could be even
more compact, but that's splitting hairs.

@posts.route('/&lt;_id&gt;/edit', methods=['GET', 'POST'])
def edit(_id):
    post = Post()
    post.get(_id)
    if request.method == 'POST':
        post.title = request.form.get('title')
        post.tags = [tag.strip()
                     for tag in request.form.get('tags').split(',')]
        post.body = request.form.get('body')
        post.update()
    return render_template('posts_edit.html', post=post)


With the latter point I mean something like this (implemention left as
an exercise for the reader):

@posts.route('/&lt;_id&gt;/edit', methods=['GET', 'POST'])
def edit(_id):
    post = Post()
    post.get(_id)
    if request.method == 'POST':
        post.update({
            "title": request.form.get('title'),
            "tags": [tag.strip()
                    for tag in request.form.get('tags').split(',')]
            "body": request.form.get('body')
        })
    return render_template('posts_edit.html', post=post)


For the other file I'd suggest looking at the usual 80 character limit,
meaning wrapping the longer lines a bit.


In save the date and _id attributes of the object aren't being
used - that looks inconsistent, either self.date and self._id
should be updated too, or neither, right?  That should probably also
be documented clearly.
With get and the __init__ call, AFAIK that's probably safe, but
coming from any background where constructors are, well, that, this
looks fishy.  Consider making that a class method too:

@classmethod
def get(cls, _id):
    return cls(**mongo.db.posts.find_one({'_id': ObjectId(_id)}))

get_all doesn't use it's argument, so it's actually more of a
staticmethod right now.  If you're no going to use inheritance make
it one then.  If you are, possibly make move mongo.db.posts into a
class variable so that you could override it for subclasses and the
methods would keep on working with the correct tables.