NickP
NickP

Reputation: 1414

Create a User Profile or other Django Object automatically

I have setup a basic Django site and have added login to the site. Additionally, I have created a Student (Profile) model that expands upon the built in User one. It has a OneToOne relationship with the User Model.

However, I have yet not come right with forcing the user to automatically create a Profile the first time they log in. How would I make sure they are not able to progress through anything without creating this?

I have tried by defining the following in views:

def UserCheck(request):
    current_user = request.user
    # Check for or create a Student; set default account type here
    try:
        profile = Student.objects.get(user = request.user)   
        if profile == None:
            return redirect('/student/profile/update')
        return True
    except:
        return redirect('/student/profile/update')

And thereafter adding the following:

UserCheck(request)

at the top of each of my views. This however, never seems to redirect a user to create a profile.

Is there a best way to ensure that the User is forced to create a profile object above?

Upvotes: 0

Views: 216

Answers (1)

Jens Astrup
Jens Astrup

Reputation: 2454

Looks like you're attempting to do something similar to Django's user_passes_test decorator (documentation). You can turn the function you have into this:

# Side note: Classes are CamelCase, not functions
def user_check(user):
    # Simpler way of seeing if the profile exists
    profile_exists = Student.objects.filter(user=user).exists()   
    if profile_exists:
       # The user can continue
       return True
    else:
        # If they don't, they need to be sent elsewhere
        return False

Then, you can add a decorator to your views:

from django.contrib.auth.decorators import user_passes_test

# Login URL is where they will be sent if user_check returns False
@user_passes_test(user_check, login_url='/student/profile/update')
def some_view(request):
    # Do stuff here
    pass

Upvotes: 2

Related Questions