coffee-grinder
coffee-grinder

Reputation: 27600

How to get or create user profile in GAE?

I have a Profile model:

class Profile(db.Model):
    user = db.UserProperty(auto_current_user=True)
    bio = db.StringProperty()

I'd like to display the user's existing bio in this view. If the user has no profile yet, I'd like to create it. Here's what I have so far, which doesn't work yet:

class BioPage(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user:
            profile = Profile.get_or_insert(user=user) #This line is wrong
            profile.bio = "No bio entered yet."
            profile.save()
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write('Hello, ' + user.nickname() + '<br/>Bio: ' + profile.bio)
        else:
            self.redirect(users.create_login_url(self.request.uri))

How do I fix the incorrect line above? I know that get_or_insert() should take a key name, but I can't figure out what that would be.

(Should the user field in Profile even be a db.UserProperty?)

Upvotes: 1

Views: 569

Answers (2)

Mark Rajcok
Mark Rajcok

Reputation: 364677

You probably don't want to use db.UserProperty, for reasons explained here. In summary, if a user changes his/her email address, your (old) stored 'User' will not compare equal to the currently-logged-in (new) 'User'.

Instead, store the user.user_id() as either a StringProperty on your Profile model (as shown on the page I referenced above), or as the key (key_name) of your Profile model. An example of the latter is here.

Upvotes: 1

Jason Hall
Jason Hall

Reputation: 20920

You have to pass the key_name to get_or_insert(), in this case, like so:

profile = Profile.get_or_insert(key_name=user.email())

Note that since the user property is auto-populated because of the auto_current_user=True you don't need to pass it to the get_or_insert() call. In your case you don't need to pass anything but the key name.

Upvotes: 2

Related Questions