17. Django 1.8 Server Build - CentOS 7 hosted on VPS - User Authentication 4 (User profile & @login_required decorator)

In this tutorial, we'll do more work on "login" and "user's profile"
In settings.py, let's set the LOGIN_URL for @login_required decorator and LOGIN_REDIRECT_URL to redirect an authenticated user to get user's profile:
# URL for @login_required decorator LOGIN_URL = '/login/' # redirect authenticated users LOGIN_REDIRECT_URL = '/profile/'
So, any time we put the login_required decorator to a view, it will go to /login/ page.
Let's go to our views in our app, and put login_required decorator and add profilein driver/views/py.
@login_required def Profile(request): if not request.user.is_authenticated(): return HrttpResponseRedirect('/login/') driver = request.user.profile context = {'driver': driver} return render_to_response('profile.html', context, context_instance=RequestContext(request))
Note that we replaced the deprecated get_profile() with profile. Otherwise, we get "object has no attribute 'get_profile'" error.
To make the request.user.profile to work, we need to modify one line in models.py:
from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save # Drive is actually a UserProfile # In settings.py : (app.className) # AUTH_PROFILE_MODULE = 'driver.Driver' class Driver(models.Model): user = models.OneToOneField(User, related_name='profile') birthday = models.DateField() name = models.CharField(max_length=100) def __unicode__(self): return self.name def create_user_profile(sender, instance, created, **kwargs): if created: #driver, new = Driver.objects.get_or_create(user=instance) Driver.objects.get_or_create(user=instance) # We want to create a profile every time # a User instance is created by registering a post_save handler, # this way every time we create a user Django will create his profile too: post_save.connect(create_user_profile, sender=User)
Of course, we need to import the login_required decorator. So, let's put that into the code:
from django.contrib.auth.decorators import login_required
So, the whole code (views.py) looks like this:
from django.http import HttpResponseRedirect from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.shortcuts import render_to_response from django.template import RequestContext from driver.forms import RegistrationForm, LoginForm from driver.models import Driver from django.contrib.auth import authenticate, login, logout def DriverRegistration(request): if request.user.is_authenticated(): return HttpResponseRedirect('/profile/') if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): user = User.objects.create_user(username=form.cleaned_data['username'], email = form.cleaned_data['email'], password = form.cleaned_data['password']) user.save() driver = Driver(user=user, name=form.cleaned_data['name'], birthday=form.cleaned_data['birthday']) driver.save() return HttpResponseRedirect('/profile/') else: return render_to_response('register.html', {'form': form}, context_instance=RequestContext(request)) else: ''' user is not submitting the form, show them a blank registration form ''' form = RegistrationForm() context = {'form': form} return render_to_response('register.html', context, context_instance=RequestContext(request)) @login_required def Profile(request): if not request.user.is_authenticated(): return HrttpResponseRedirect('/login/') driver = request.user.profile context = {'driver': driver} return render_to_response('profile.html', context, context_instance=RequestContext(request)) def LoginRequest(request): if request.user.is_authenticated(): return HttpResponseRedirect('/profile/') if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] driver = authenticate(username=username, password=password) if driver is not None: login(request, driver) return HttpResponseRedirect('/profile/') else: return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request)) else: return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request)) else: ''' user is not submitting the form, show the login form ''' form = LoginForm() context = {'form': form} return render_to_response('login.html', context, context_instance=RequestContext(request)) def LogoutRequest(request): logout(request) return HttpResponseRedirect('/')
Now we need to define the Profile() function:
{% extends "base.html" %} {% block content %} <p>Name: {{ driver.name }}</p> <p>Birthday: {{ driver.birthday }}</p> {% endblock %}
from django.conf.urls import include, url from django.contrib import admin from django.conf import settings urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^tinymce/', include('tinymce.urls')), url(r'^$', 'pages.views.MainHomePage'), url(r'^cars/$', 'car.views.CarsAll'), url(r'^cars/(?P<carslug>.*)/$', 'car.views.SpecificCar'), url(r'^makes/(?P<makeslug>.*)/$', 'car.views.SpecificMake'), url(r'^media/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT, }), url(r'^register/$', 'driver.views.DriverRegistration'), url(r'^login/$', 'driver.views.LoginRequest'), url(r'^logout/$', 'driver.views.LogoutRequest'), url(r'^resetpassword/passwordsent/$', 'django.contrib.auth.views.password_reset_done'), url(r'^resetpassword/$', 'django.contrib.auth.views.password_reset', {'post_reset_redirect' : 'django.contrib.auth.views.password_reset_done'}, name="password_reset"), url(r'^reset/(?P<uidb64>[0-9A-Za-z]+)/(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', name='password_reset_confirm'), url(r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete', name='password_reset_complete'), url(r'^profile/$', 'driver.views.Profile'), ]
Let's go to /profile page while we're not logged in:

Click login:

At "Submit", we get the logged-in user's profile:

If we type in /profile url:

and then, hit Enter. It will redirect us to login pageL

Ph.D. / Golden Gate Ave, San Francisco / Seoul National Univ / Carnegie Mellon / UC Berkeley / DevOps / Deep Learning / Visualization