0

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.

Deonomo
  • 1,583
  • 3
  • 16
  • 25
  • Why are you doing all that `__getitem__` stuff? Just do `query_dict['username']` etc. You almost never need to call double-underscore methods directly. – Daniel Roseman Jan 17 '12 at 21:42
  • Thanks. I was wondering about that. This is my first week of Django, so I sometimes follow docs blindly without deep understanding. – Deonomo Jan 17 '12 at 22:01

2 Answers2

4

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.

AdamKG
  • 13,678
  • 3
  • 38
  • 46
  • **Note**: this answer applies for an old version of Django. See [Extending the User model with custom fields in Django - Stack Overflow](https://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) for the guide in newer Django versions. – user202729 Aug 13 '21 at 09:23
1

From the page you linked to:

"see the section on storing additional user information below.", referring to https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

That section tells you that there is a setting, "AUTH_PROFILE_MODULE", which declares the model that User.get_profile will return.

You will also want to follow the instructions on setting up a post_save signal handler on the User model, to automatically create an instance of your profile model every time a User object is created. If you don't do that, then User.get_profile() can and will throw exceptions.

Ian Clelland
  • 43,011
  • 8
  • 86
  • 87