Search code examples
djangodjango-modelsdjango-users

In Django, how can I store data in my UserProfile table associated with the User table?


I'm trying to follow the docs and set up a UserProfile table in my model, associate it with the User table in the admin area, and then store additional information about my users in this UserProfile table when they register.

In views.py I have the following:

from django.contrib.auth import authenticate, login, logout


def register(request):
    if request.method == 'POST':
        query_dict = request.POST
        username = query_dict.__getitem__("username")
        email = query_dict.__getitem__("user_email")
        password = query_dict.__getitem__("password")
        repeat_password = query_dict.__getitem__("repeat_password")
        role = query_dict.__getitem__("role")
        user = User.objects.create_user(username, email, password)
        # django.db.models.signals.post_save gets called here and creates the UserProfile
        # I can write something like user_profile = user.get_profile() but I don't
        # know how to save information to the profile.
        user = authenticate(username=username, password=password)

        if user is not None and user.is_active:
            login(request, user)
            return HttpResponseRedirect("/")

As you can see in the comments in my code above, I can retrieve the associated UserProfile object, but I don't know where to go from there to store the additional data (the role) in the UserProfile table. All the documentation tells me is:

get_profile() Returns a site-specific profile for this user. Raises django.contrib.auth.models.SiteProfileNotAvailable if the current site doesn't allow profiles, or django.core.exceptions.ObjectDoesNotExist if the user does not have a profile.

You can view it here: https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.get_profile

But the docs don't tell me what kind of object get_profile() returns, or how I can use it to store information in the UserProfile table.


Solution

  • NOTE: This answer is out of date, Django no longer supports AUTH_PROFILE_MODULE. See this question for answers that should still work with recent Django releases.

    User.get_profile() returns an instance of whatever you have AUTH_PROFILE_MODULE set to. You should set it to "yourapp.UserProfile" (adjust for yourapp). Then you should be able to do something like this:

    from yourapp.models import UserProfile
    profile = user.get_profile()
    assert isinstance(profile, UserProfile)
    profile.role = role
    profile.save() # saves to DB
    

    You don't actually need the import or assert lines - that's just for you to sanity-check that UserProfile is what you expect it to be.