{"id":6043,"date":"2022-12-02T09:38:06","date_gmt":"2022-12-02T09:38:06","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=6043"},"modified":"2023-08-17T09:48:43","modified_gmt":"2023-08-17T09:48:43","slug":"django-loginview","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/django-tutorial\/django-loginview\/","title":{"rendered":"Django LoginView"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to use the Django <code>LoginView<\/code> to create a login page for the Todo App.<\/p>\n\n\n\n<p class=\"note\">This tutorial begins where&nbsp;the&nbsp;<a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-deleteview\/\">Django DeleteView tutorial<\/a>&nbsp;left off.<\/p>\n\n\n\n<p>Django&#8217;s <code>LoginView<\/code> allows you to display the login form and process the login action. We&#8217;ll use the <code>LoginView<\/code> class to create a login page for the <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-todo-app\/\">Todo App<\/a>.<\/p>\n\n\n\n<p class=\"note\">You can download the <a href=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/todo_list_7_login_view.zip\">final code of this tutorial<\/a> here.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='creating-configuring-users-app-for-the-todo-project'>Creating &amp; configuring users app for the todo project <a href=\"#creating-configuring-users-app-for-the-todo-project\" class=\"anchor\" id=\"creating-configuring-users-app-for-the-todo-project\" title=\"Anchor for Creating &amp; configuring users app for the todo project\">#<\/a><\/h2>\n\n\n\n<p>The <code>users<\/code> app will have the following functionalities:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Login \/ Logout<\/li>\n\n\n\n<li>Register <\/li>\n\n\n\n<li>Reset password<\/li>\n<\/ul>\n\n\n\n<p>In this tutorial, we&#8217;ll focus on the Login \/ Logout functions.<\/p>\n\n\n\n<p>First, use the <code>startapp<\/code> command to create the <code>users<\/code> app:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">django-admin startapp users<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, register the <code>users<\/code> app in the <code>settings.py<\/code> of the project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">INSTALLED_APPS = &#91;\n    <span class=\"hljs-comment\">#...<\/span>\n    <span class=\"hljs-string\">'users'<\/span>\n]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then, create <code>urls.py<\/code> in the <code>users<\/code> app with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path\n\nurlpatterns = &#91;]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After that, include the <code><code>urls.py<\/code><\/code> of the <code>users<\/code> app in the <code><code>urls.py<\/code><\/code> of the project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.contrib <span class=\"hljs-keyword\">import<\/span> admin\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path, include\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>urlpatterns = &#91;\n<\/span><\/span><span class='shcb-loc'><span>    path(<span class=\"hljs-string\">'admin\/'<\/span>, admin.site.urls),\n<\/span><\/span><span class='shcb-loc'><span>    path(<span class=\"hljs-string\">''<\/span>,include(<span class=\"hljs-string\">'todo.urls'<\/span>)),\n<\/span><\/span><mark class='shcb-loc'><span>    path(<span class=\"hljs-string\">''<\/span>,include(<span class=\"hljs-string\">'users.urls'<\/span>))\n<\/span><\/mark><span class='shcb-loc'><span>]\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, create the <code>templates<\/code> directory, and <code>users<\/code> directory inside the <code>templates<\/code> directory in the <code>users<\/code> app to store the templates.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='creating-a-login-page'>Creating a login page <a href=\"#creating-a-login-page\" class=\"anchor\" id=\"creating-a-login-page\" title=\"Anchor for Creating a login page\">#<\/a><\/h2>\n\n\n\n<p>The following defines the <code>My<code>LoginView<\/code><\/code> class in the <code>views.py<\/code> file that inherits from the <code>LoginView<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.views <span class=\"hljs-keyword\">import<\/span> LoginView\n<span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> reverse_lazy\n<span class=\"hljs-keyword\">from<\/span> django.contrib <span class=\"hljs-keyword\">import<\/span> messages\n\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyLoginView<\/span><span class=\"hljs-params\">(LoginView)<\/span>:<\/span>\n    redirect_authenticated_user = <span class=\"hljs-literal\">True<\/span>\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">get_success_url<\/span><span class=\"hljs-params\">(self)<\/span>:<\/span>\n        <span class=\"hljs-keyword\">return<\/span> reverse_lazy(<span class=\"hljs-string\">'tasks'<\/span>) \n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">form_invalid<\/span><span class=\"hljs-params\">(self, form)<\/span>:<\/span>\n        messages.error(self.request,<span class=\"hljs-string\">'Invalid username or password'<\/span>)\n        <span class=\"hljs-keyword\">return<\/span> self.render_to_response(self.get_context_data(form=form))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, import the <code>LoginView<\/code> from the <code><code>django.contrib<\/code><\/code>.<code>auth.views<\/code>, <code>reverse_lazy<\/code> from <code>django.urls<\/code>, and messages from <code><code>django.contrib<\/code><\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.views <span class=\"hljs-keyword\">import<\/span> LoginView\n<span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> reverse_lazy\n<span class=\"hljs-keyword\">from<\/span> django.contrib <span class=\"hljs-keyword\">import<\/span> messages<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the <code>My<code>LoginView<\/code><\/code> class that inherits from the <code>LoginView<\/code> class. The <code>My<code>LoginView<\/code><\/code> has the following attributes and methods:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><code>redirect_authenticated_user<\/code><\/code> is set to <code>True<\/code> to instruct Django to redirect the users once they log in successfully. By default, the <code><code>redirect_authenticated_user<\/code><\/code> is <code>False<\/code>, which turns off the redirection.<\/li>\n\n\n\n<li><code>get_success_url()<\/code> returns the URL to redirect after the users log in successfully.<\/li>\n\n\n\n<li><code><code>form_invalid()<\/code><\/code> is called once the login is failed. In the <code><code>form_invalid()<\/code><\/code>, we <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-flash-messages\/\">create a flash message<\/a> and rerender the login form.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id='defining-a-route-for-the-login-page'>Defining a route for the login page <a href=\"#defining-a-route-for-the-login-page\" class=\"anchor\" id=\"defining-a-route-for-the-login-page\" title=\"Anchor for Defining a route for the login page\">#<\/a><\/h2>\n\n\n\n<p> Modify the <code>views.py<\/code> file to define a route for the login page:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .views <span class=\"hljs-keyword\">import<\/span> MyLoginView\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>urlpatterns = &#91;\n<\/span><\/span><mark class='shcb-loc'><span>    path(<span class=\"hljs-string\">'login\/'<\/span>, MyLoginView.as_view(),name=<span class=\"hljs-string\">'login'<\/span>),\n<\/span><\/mark><span class='shcb-loc'><span>]\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, import the <code>MyLoginView<\/code> class from the <code>views.py<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> .views <span class=\"hljs-keyword\">import<\/span> MyLoginView<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, map the <code>login\/<\/code> route to the result of <code>as_view()<\/code> method of the <code>MyLoginView<\/code> class.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">urlpatterns = &#91;\n    path(<span class=\"hljs-string\">'login\/'<\/span>, MyLoginView.as_view(),name=<span class=\"hljs-string\">'login'<\/span>),\n]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='creating-a-login-template'>Creating a login template <a href=\"#creating-a-login-template\" class=\"anchor\" id=\"creating-a-login-template\" title=\"Anchor for Creating a login template\">#<\/a><\/h2>\n\n\n\n<p>First, create the <code>login.html<\/code> template in the <code>templates\/users<\/code> directory with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">{%extends 'base.html'%}\n\n{%block content%}\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"center\"<\/span>&gt;<\/span>\n\t  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"post\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"card\"<\/span> <span class=\"hljs-attr\">novalidate<\/span>&gt;<\/span>\n\t  \t{% csrf_token %}\n\t    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>Log in to your account<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n\t\t{% for field in form %}\n\t    \t\t{{ field.label_tag }} \n\t        \t{{ field }}\n\t        \t{% if field.errors %}\n\t        \t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span>&gt;<\/span>{{ field.errors|striptags }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span> \n\t        \t{% endif %}\n\t\t{% endfor %}\n\t\t\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"Login\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-primary full-width\"<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">hr<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>Forgot your password <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"#\"<\/span>&gt;<\/span>Reset Password<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>Don't have a account? <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"#\"<\/span>&gt;<\/span>Join Now<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n{%endblock content%}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you open the login URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">http:\/\/<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>:<span class=\"hljs-number\">8000<\/span>\/login\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>you&#8217;ll see the following login form:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"491\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login-form.png\" alt=\"\" class=\"wp-image-6044\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login-form.png 508w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login-form-300x290.png 300w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/figure>\n\n\n\n<p>If you enter a valid username and password, you&#8217;ll log in successfully. Otherwise, you&#8217;ll get a message saying you have entered an invalid username or password.<\/p>\n\n\n\n<p>Second, add the <code>LOGIN_URL<\/code> to the <code>settings.py<\/code> of the project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">LOGIN_URL = <span class=\"hljs-string\">'login'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you attempt to access a page that requires login, Django will use this <code><code>LOGIN_URL<\/code><\/code> for redirection. If you don&#8217;t add the <code><code>LOGIN_URL<\/code><\/code> to the <code>settings.py<\/code>, Django will use the default login URL which is <code>accounts\/login\/<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='creating-a-logout-url'>Creating a logout URL <a href=\"#creating-a-logout-url\" class=\"anchor\" id=\"creating-a-logout-url\" title=\"Anchor for Creating a logout URL\">#<\/a><\/h2>\n\n\n\n<p>The <code><code>LogoutView<\/code><\/code> logs a user out and displays a message. We&#8217;ll use the <code><code>LogoutView<\/code><\/code> to create a logout link.<\/p>\n\n\n\n<p>Unlike the <code>LoginView<\/code> class, you can use the <code>LogoutView<\/code> class directly in the <code>urls.py<\/code>. For example, you can modify the <code>views.py<\/code> to create a route for the logout URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> path\n<span class=\"hljs-keyword\">from<\/span> .views <span class=\"hljs-keyword\">import<\/span> MyLoginView\n<span class=\"hljs-keyword\">from<\/span> django.contrib.auth.views <span class=\"hljs-keyword\">import<\/span> LogoutView \n\nurlpatterns = &#91;\n    path(<span class=\"hljs-string\">'login\/'<\/span>, MyLoginView.as_view(),name=<span class=\"hljs-string\">'login'<\/span>),\n    path(<span class=\"hljs-string\">'logout\/'<\/span>, LogoutView.as_view(next_page=<span class=\"hljs-string\">'login'<\/span>),name=<span class=\"hljs-string\">'logout'<\/span>),\n]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, import the <code>LogoutView<\/code> from the <code>django.contrib<\/code>.<code>auth.views<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.views <span class=\"hljs-keyword\">import<\/span> LogoutView<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, map the URL <code>logout\/<\/code> with the result of the <code>as_view()<\/code> method of the <code>LogoutView<\/code> class. The <code>next_page<\/code> argument specifies the URL that the users will be redirected to once they log out successfully.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">path(<span class=\"hljs-string\">'logout\/'<\/span>, LogoutView.as_view(next_page=<span class=\"hljs-string\">'login'<\/span>),name=<span class=\"hljs-string\">'logout'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id='adding-loginlogout-links-to-the-header'>Adding login\/logout links to the header <a href=\"#adding-loginlogout-links-to-the-header\" class=\"anchor\" id=\"adding-loginlogout-links-to-the-header\" title=\"Anchor for Adding login\/logout links to the header\">#<\/a><\/h2>\n\n\n\n<p>If the user logs in, the header shows the home, my tasks, new task, and logout link. Once the user logs out, the header displays the home, login, and join now links.<\/p>\n\n\n\n<p>To achieve this, you modify the <code>base.html<\/code> template of the project as follows.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table\"><span class='shcb-loc'><span>{%load static %}\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{% static 'css\/style.css' %}\"<\/span> \/&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Todo List<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">header<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"header\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{%url 'home'%}\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"logo\"<\/span>&gt;<\/span>Todo<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nav<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"nav\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t            \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{%url 'home'%}\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"bi bi-house-fill\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span> Home<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>\t                {% if request.user.is_authenticated %}\n<\/span><\/mark><mark class='shcb-loc'><span>\t    \t              \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{% url 'tasks' %}\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"bi bi-list-task\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span> My Tasks<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t    \t              \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{% url 'task-create' %}\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">i<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"bi bi-plus-circle\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">i<\/span>&gt;<\/span> Create Task<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t\t                \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"#\"<\/span>&gt;<\/span>Hi {{request.user | title}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t    \t                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{% url 'logout' %}\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-outline\"<\/span>&gt;<\/span>Logout<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t                {% else %}\n<\/span><\/mark><mark class='shcb-loc'><span>\t\t\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{% url 'login' %}\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-outline\"<\/span>&gt;<\/span>Login<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t            \t        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"#\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"btn btn-primary\"<\/span>&gt;<\/span>Join Now<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>\t                {% endif %}\n<\/span><\/mark><span class='shcb-loc'><span>\t              <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">nav<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">header<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">main<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            \t{% if messages %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t{% for message in messages %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"alert alert-{{message.tags}}\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t       {{message}}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t     <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t   {% endfor %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t{% endif %}\n<\/span><\/span><span class='shcb-loc'><span>            \n<\/span><\/span><span class='shcb-loc'><span>             {%block content %}\n<\/span><\/span><span class='shcb-loc'><span>             {%endblock content%}\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">main<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">footer<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"footer\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\u00a9 Copyright {% now \"Y\" %} by <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/www.pythontutorial.net\"<\/span>&gt;<\/span>Python Tutorial<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">footer<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Note that if the user logs in, the <code>request.user.is_authenticated<\/code> returns <code>True<\/code>. Therefore, you can use this property to check whether a user is logged or not.<\/p>\n\n\n\n<p>If you are not logged in, you&#8217;ll see the following links in the navigation:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"901\" height=\"370\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-home.png\" alt=\"\" class=\"wp-image-6045\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-home.png 901w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-home-300x123.png 300w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-home-768x315.png 768w\" sizes=\"auto, (max-width: 901px) 100vw, 901px\" \/><\/figure>\n\n\n\n<p>However, if you log in, you&#8217;ll see the following navigation links:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"879\" height=\"380\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login.png\" alt=\"\" class=\"wp-image-6046\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login.png 879w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login-300x130.png 300w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/django-loginview-login-768x332.png 768w\" sizes=\"auto, (max-width: 879px) 100vw, 879px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"730\" style=\"aspect-ratio: 860 \/ 730;\" width=\"860\" controls src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/Django-LoginView-Demo.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id='loginrequiredmixin'>LoginRequiredMixin <a href=\"#loginrequiredmixin\" class=\"anchor\" id=\"loginrequiredmixin\" title=\"Anchor for LoginRequiredMixin\">#<\/a><\/h2>\n\n\n\n<p>Although you&#8217;re not logged in, you still can manage the task list such as viewing, adding, editing, and deleting the tasks. To protect these pages, you&#8217;ll use the <code>LoginRequiredMixin<\/code> class.<\/p>\n\n\n\n<p>To do that, you modify the <code>views.py<\/code> of the todo application and use the <code>LoginRequiredMixin<\/code> class as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.shortcuts <span class=\"hljs-keyword\">import<\/span> render\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.views.generic.list <span class=\"hljs-keyword\">import<\/span> ListView\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.views.generic.detail <span class=\"hljs-keyword\">import<\/span> DetailView\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.views.generic.edit <span class=\"hljs-keyword\">import<\/span> CreateView, UpdateView, DeleteView\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.contrib <span class=\"hljs-keyword\">import<\/span> messages\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.urls <span class=\"hljs-keyword\">import<\/span> reverse_lazy\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.mixins <span class=\"hljs-keyword\">import<\/span> LoginRequiredMixin\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .models <span class=\"hljs-keyword\">import<\/span> Task\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskDelete<\/span><span class=\"hljs-params\">(LoginRequiredMixin, DeleteView)<\/span>:<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    model = Task\n<\/span><\/span><span class='shcb-loc'><span>    context_object_name = <span class=\"hljs-string\">'task'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    success_url = reverse_lazy(<span class=\"hljs-string\">'tasks'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">form_valid<\/span><span class=\"hljs-params\">(self, form)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        messages.success(self.request, <span class=\"hljs-string\">\"The task was deleted successfully.\"<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> super(TaskDelete,self).form_valid(form)\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskUpdate<\/span><span class=\"hljs-params\">(LoginRequiredMixin, UpdateView)<\/span>:<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    model = Task\n<\/span><\/span><span class='shcb-loc'><span>    fields = &#91;<span class=\"hljs-string\">'title'<\/span>,<span class=\"hljs-string\">'description'<\/span>,<span class=\"hljs-string\">'completed'<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>    success_url = reverse_lazy(<span class=\"hljs-string\">'tasks'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">form_valid<\/span><span class=\"hljs-params\">(self, form)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        messages.success(self.request, <span class=\"hljs-string\">\"The task was updated successfully.\"<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> super(TaskUpdate,self).form_valid(form)\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskCreate<\/span><span class=\"hljs-params\">(LoginRequiredMixin, CreateView)<\/span>:<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    model = Task\n<\/span><\/span><span class='shcb-loc'><span>    fields = &#91;<span class=\"hljs-string\">'title'<\/span>,<span class=\"hljs-string\">'description'<\/span>,<span class=\"hljs-string\">'completed'<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>    success_url = reverse_lazy(<span class=\"hljs-string\">'tasks'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>   \n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">form_valid<\/span><span class=\"hljs-params\">(self, form)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        form.instance.user = self.request.user\n<\/span><\/span><span class='shcb-loc'><span>        messages.success(self.request, <span class=\"hljs-string\">\"The task was created successfully.\"<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> super(TaskCreate,self).form_valid(form)\n<\/span><\/span><span class='shcb-loc'><span>        \n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskDetail<\/span><span class=\"hljs-params\">(LoginRequiredMixin, DetailView)<\/span>:<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    model = Task\n<\/span><\/span><span class='shcb-loc'><span>    context_object_name = <span class=\"hljs-string\">'task'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TaskList<\/span><span class=\"hljs-params\">(LoginRequiredMixin,ListView)<\/span>:<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    model = Task\n<\/span><\/span><span class='shcb-loc'><span>    context_object_name = <span class=\"hljs-string\">'tasks'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">home<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'home.html'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>   \n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you have not logged in and attempted to access a protected page, Django will redirect you to the login page. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">http:\/\/<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>:<span class=\"hljs-number\">8000<\/span>\/task\/create<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Django will redirect you to the login page using the <code>LOGIN_URL<\/code> configured in the <code>settings.py<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">http:\/\/<span class=\"hljs-number\">127.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.1<\/span>:<span class=\"hljs-number\">8000<\/span>\/login\/?next=\/task\/create\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Python<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">python<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-video\"><video height=\"752\" style=\"aspect-ratio: 910 \/ 752;\" width=\"910\" controls src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/12\/Django-LoginView-Redirect.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the <code>LoginView<\/code> class to create a login page.<\/li>\n\n\n\n<li>Use the <code>LogoutView<\/code> class to log a user out.<\/li>\n\n\n\n<li>Use the <code>LoginRequiredMixin<\/code> class to protect a page.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"6043\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-loginview\/\"\n\t\t\t\tdata-post-title=\"Django LoginView\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"6043\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-loginview\/\"\n\t\t\t\tdata-post-title=\"Django LoginView\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn how to use the Django LoginView to create a login page for the Todo App.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":5531,"menu_order":18,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6043","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/6043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/comments?post=6043"}],"version-history":[{"count":0,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/6043\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5531"}],"wp:attachment":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/media?parent=6043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}