{"id":5917,"date":"2022-11-29T01:23:07","date_gmt":"2022-11-29T01:23:07","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=5917"},"modified":"2023-08-17T09:33:36","modified_gmt":"2023-08-17T09:33:36","slug":"django-registration","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/django-tutorial\/django-registration\/","title":{"rendered":"Django Registration"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to create a Django registration form that allows users to sign up.<\/p>\n\n\n\n<p class=\"note\">This tutorial begins where&nbsp;the&nbsp;<a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-login\/\">Django login\/logout tutorial<\/a>&nbsp;left off.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='creating-a-django-registration-form'>Creating a Django registration form <a href=\"#creating-a-django-registration-form\" class=\"anchor\" id=\"creating-a-django-registration-form\" title=\"Anchor for Creating a Django registration form\">#<\/a><\/h2>\n\n\n\n<p>First, define a registration URL in the <code>urls.py<\/code> of 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 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> . <span class=\"hljs-keyword\">import<\/span> views\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\">'login\/'<\/span>, views.sign_in, name=<span class=\"hljs-string\">'login'<\/span>),\n<\/span><\/span><span class='shcb-loc'><span>    path(<span class=\"hljs-string\">'logout\/'<\/span>, views.sign_out, name=<span class=\"hljs-string\">'logout'<\/span>),\n<\/span><\/span><mark class='shcb-loc'><span>    path(<span class=\"hljs-string\">'register\/'<\/span>, views.sign_up, name=<span class=\"hljs-string\">'register'<\/span>),\n<\/span><\/mark><span class='shcb-loc'><span>]\n<\/span><\/span><\/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>Second, define a <code>RegisterForm<\/code> class in the <code>forms.py<\/code> of the <code>users.py<\/code> file:<\/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 shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django <span class=\"hljs-keyword\">import<\/span> forms\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.models <span class=\"hljs-keyword\">import<\/span> User\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.contrib.auth.forms <span class=\"hljs-keyword\">import<\/span> UserCreationForm\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-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LoginForm<\/span><span class=\"hljs-params\">(forms.Form)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    username = forms.CharField(max_length=<span class=\"hljs-number\">65<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>    password = forms.CharField(max_length=<span class=\"hljs-number\">65<\/span>, widget=forms.PasswordInput)\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\">RegisterForm<\/span><span class=\"hljs-params\">(UserCreationForm)<\/span>:<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Meta<\/span>:<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>        model=User\n<\/span><\/mark><mark class='shcb-loc'><span>        fields = &#91;<span class=\"hljs-string\">'username'<\/span>,<span class=\"hljs-string\">'email'<\/span>,<span class=\"hljs-string\">'password1'<\/span>,<span class=\"hljs-string\">'password2'<\/span>] \n<\/span><\/mark><span class='shcb-loc'><span>   \n<\/span><\/span><\/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>The <code>RegisterForm<\/code> uses the built-in <code>User<\/code> model and includes four fields including <code>username<\/code>, <code>email<\/code>, <code>password1<\/code>, and <code>password2<\/code>, which the user needs to fill in for registration.<\/p>\n\n\n\n<p>Third, define the <code>sign_up()<\/code> view function in the <code>views.py<\/code> of the <code>users<\/code> app:<\/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 shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.shortcuts <span class=\"hljs-keyword\">import<\/span> render, redirect\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.contrib.auth <span class=\"hljs-keyword\">import<\/span> login, authenticate, logout\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .forms <span class=\"hljs-keyword\">import<\/span> LoginForm, RegisterForm\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><mark class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">sign_up<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/mark><mark class='shcb-loc'><span>        form = RegisterForm()\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'users\/register.html'<\/span>, { <span class=\"hljs-string\">'form'<\/span>: form})   \n<\/span><\/mark><\/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>The <code>sign_up()<\/code> view function creates the <code>RegisterForm<\/code> object and renders it in the <code>register.html<\/code> template.<\/p>\n\n\n\n<p>Fourth, create a <code>register.html<\/code> template in the <code>templates\/users<\/code> directory of the <code>users<\/code> application:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" 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\n<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\">novalidate<\/span>&gt;<\/span>\n\t{% csrf_token %}\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Sign Up<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n\t{{ form.as_p }}\t\t\n\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\">\"Register\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n\n{% endblock content%}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>The <code>registerl.html<\/code> extends the <code>base.html<\/code> template of the project. It renders the <code>RegisterForm<\/code> (form). <\/p>\n\n\n\n<p>Note that the <code>novalidate<\/code> property removes the HTML5 validation. Once completing the project, you can remove this property to enable HTML5 validation.<\/p>\n\n\n\n<p>Finally, open the registration URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">http:&#47;&#47;127.0.0.1:8000\/register\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&#8230;you&#8217;ll see the registration form as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"510\" height=\"601\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-default.png\" alt=\"djang register form - default\" class=\"wp-image-5921\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-default.png 510w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-default-255x300.png 255w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id='customize-the-django-register-form'>Customize the Django register form <a href=\"#customize-the-django-register-form\" class=\"anchor\" id=\"customize-the-django-register-form\" title=\"Anchor for Customize the Django register form\">#<\/a><\/h2>\n\n\n\n<p>The registration form has four fields with a lot of information. This information comes from the default <code>User<\/code> model. <\/p>\n\n\n\n<p>If you want to customize the information displayed on the form, you can modify the <code>register.html<\/code> template as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" 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\">form<\/span> <span class=\"hljs-attr\">method<\/span>=<span class=\"hljs-string\">\"POST\"<\/span> <span class=\"hljs-attr\">novalidate<\/span>&gt;<\/span>\n\t{% csrf_token %}\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Sign Up<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n\t\t\n\t{% for field in form %}\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t\t{% if field.errors %}\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"errorlist\"<\/span>&gt;<\/span>\n\t\t\t{% for error in field.errors %}\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>{{ error }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n\t\t\t{% endfor %}\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ul<\/span>&gt;<\/span>\n\t\t{% endif %}\n\t \t{{ field.label_tag }} {{ field }}\n\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t{% endfor %}\n\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\">\"Register\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n{% endblock content%}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>The template iterates over fields of the form and outputs each field individually. For each field, it displays the error list if the validation fails.<\/p>\n\n\n\n<p>The new form will look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"505\" height=\"356\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-customize.png\" alt=\"djang register form - customize\" class=\"wp-image-5922\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-customize.png 505w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-customize-300x211.png 300w\" sizes=\"auto, (max-width: 505px) 100vw, 505px\" \/><\/figure>\n\n\n\n<p>If you fill out the information and click register, you&#8217;ll get an error because we haven&#8217;t added the code that handles the HTTP  POST request.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='handling-registration-logic'>Handling Registration logic <a href=\"#handling-registration-logic\" class=\"anchor\" id=\"handling-registration-logic\" title=\"Anchor for Handling Registration logic\">#<\/a><\/h2>\n\n\n\n<p>To handle the HTTP POST request, you modify the <code>sign_up()<\/code> function in the <code>views.py<\/code> file of the <code>users<\/code> application:<\/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-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">sign_up<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        form = RegisterForm()\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'users\/register.html'<\/span>, {<span class=\"hljs-string\">'form'<\/span>: form})    \n<\/span><\/span><span class='shcb-loc'><span>   \n<\/span><\/span><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n<\/span><\/mark><mark class='shcb-loc'><span>        form = RegisterForm(request.POST) \n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-keyword\">if<\/span> form.is_valid():\n<\/span><\/mark><mark class='shcb-loc'><span>            user = form.save(commit=<span class=\"hljs-literal\">False<\/span>)\n<\/span><\/mark><mark class='shcb-loc'><span>            user.username = user.username.lower()\n<\/span><\/mark><mark class='shcb-loc'><span>            user.save()\n<\/span><\/mark><mark class='shcb-loc'><span>            messages.success(request, <span class=\"hljs-string\">'You have singed up successfully.'<\/span>)\n<\/span><\/mark><mark class='shcb-loc'><span>            login(request, user)\n<\/span><\/mark><mark class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-keyword\">else<\/span>:\n<\/span><\/mark><mark class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'users\/register.html'<\/span>, {<span class=\"hljs-string\">'form'<\/span>: form})\n<\/span><\/mark><\/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, create a new instance of the <code>RegisterForm<\/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\">form = RegisterForm(request.POST)<\/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>If the form is valid, we save the form but do not immediately store it in the database. This is done by passing the argument <code>commit=False<\/code> to the <code>save()<\/code> method of the form object.<\/p>\n\n\n\n<p>The reason is that we want to make the user name lowercase before saving it in the database:<\/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\">user.username = user.username.lower()\nuser.save()<\/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<p>After saving the user, we <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-flash-messages\/\">create a flash message<\/a>, <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-login\/\">log the user in<\/a> and redirect the user to the post list page:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">messages.success(request, <span class=\"hljs-string\">'You have singed up successfully.'<\/span>)\nlogin(request, user)\n<span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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 the form is not valid, we rerender the form with the previously entered values by passing the form object to the <code>render()<\/code> function:<\/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\"><span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'users\/register.html'<\/span>, {<span class=\"hljs-string\">'form'<\/span>: form})<\/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>The following example illustrates how to sign up a user with the username <code>jane<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"507\" height=\"355\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup.png\" alt=\"\" class=\"wp-image-5923\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup.png 507w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup-300x210.png 300w\" sizes=\"auto, (max-width: 507px) 100vw, 507px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"516\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup-success.png\" alt=\"\" class=\"wp-image-5924\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup-success.png 482w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-signup-success-280x300.png 280w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id='adding-the-links'>Adding the links <a href=\"#adding-the-links\" class=\"anchor\" id=\"adding-the-links\" title=\"Anchor for Adding the links\">#<\/a><\/h2>\n\n\n\n<p>First, include the registration link by modifying the <code>base.html<\/code> template. Also, include the <code>My Posts<\/code> and <code>New Post<\/code> links if the user is logged in:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" 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\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"{% static 'js\/app.js' %}\"<\/span> <span class=\"hljs-attr\">defer<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>My Site<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>  \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">header<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  \t\t{%if request.user.is_authenticated %}\n<\/span><\/span><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 'posts' %}\"<\/span>&gt;<\/span>My Posts<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 'post-create' %}\"<\/span>&gt;<\/span>New Post<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>  \t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span>&gt;<\/span>Hi {{ request.user.username | title }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n<\/span><\/span><span 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 'logout' %}\"<\/span>&gt;<\/span>Logout<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  \t\t{%else%}\n<\/span><\/span><span 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 'login' %}\"<\/span>&gt;<\/span>Login<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/span><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 'register' %}\"<\/span>&gt;<\/span>Register<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>  \t\t{%endif%}\n<\/span><\/span><span class='shcb-loc'><span>  \t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">header<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  \t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">main<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t  \t{% if messages %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"messages\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t{% for message in messages %}\n<\/span><\/span><span class='shcb-loc'><span>\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 {% if message.tags %}alert-{{ message.tags }}\"<\/span>{% <span class=\"hljs-attr\">endif<\/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<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t{% endfor %}\n<\/span><\/span><span class='shcb-loc'><span>\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{% endif %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t    \n<\/span><\/span><span class='shcb-loc'><span>\t    {%block content%} \n<\/span><\/span><span class='shcb-loc'><span>\t    {%endblock content%}\n<\/span><\/span><span class='shcb-loc'><span>  \t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">main<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\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-12\"><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<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"287\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-header-links.png\" alt=\"\" class=\"wp-image-5927\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-header-links.png 536w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-header-links-300x161.png 300w\" sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/figure>\n\n\n\n<p>Second, include the registration link in the <code>login.html<\/code> template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" 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>{% extends 'base.html' %}\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><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\">novalidate<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t{% csrf_token %}\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Login<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t{{form.as_p}}\n<\/span><\/span><span class='shcb-loc'><span>\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> \/&gt;<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Don't have an account? <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{%url 'register' %}\"<\/span>&gt;<\/span>Register<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><\/mark><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>{% endblock content%}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"315\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-login-links.png\" alt=\"\" class=\"wp-image-5926\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-login-links.png 504w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-login-links-300x188.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<p>Third, add the login link to the <code>register.html<\/code> page:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" 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>{% extends 'base.html' %}\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><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\">novalidate<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t{% csrf_token %}\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>Sign Up<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\n<\/span><\/span><span class='shcb-loc'><span>\t{% for field in form %}\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t{% if field.errors %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"errorlist\"<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t{% for error in field.errors %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>{{ error }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t{% endfor %}\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ul<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t{% endif %}\n<\/span><\/span><span class='shcb-loc'><span>\t \t{{ field.label_tag }} {{ field }}\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t{% endfor %}\n<\/span><\/span><span class='shcb-loc'><span>\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\">\"Register\"<\/span> \/&gt;<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Already has an account? <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"{%url 'login' %}\"<\/span>&gt;<\/span>Login<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><\/mark><span class='shcb-loc'><span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>{% endblock content%}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"443\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-register-links.png\" alt=\"\" class=\"wp-image-5925\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-register-links.png 508w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-register-links-300x262.png 300w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id='preventing-a-user-from-editing-deleting-posts-of-other-users'>Preventing a user from editing \/ deleting posts of other users <a href=\"#preventing-a-user-from-editing-deleting-posts-of-other-users\" class=\"anchor\" id=\"preventing-a-user-from-editing-deleting-posts-of-other-users\" title=\"Anchor for Preventing a user from editing \/ deleting posts of other users\">#<\/a><\/h2>\n\n\n\n<p>Typically, a user should not be able to edit or delete a post of other users. However, the user can view the posts from other users.<\/p>\n\n\n\n<p>To implement this function, we need to check if the author of the post is the same as the currently logged user. If yes, we render the edit\/delete forms. Otherwise, we can redirect the users to a 404 page.<\/p>\n\n\n\n<p>Also, we need to hide the edit and delete links of the post list page if the posts do not belong to the user.<\/p>\n\n\n\n<p>First, modify the <code>views.py<\/code> of the <code>blog<\/code> application:<\/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 shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> django.shortcuts <span class=\"hljs-keyword\">import<\/span> render,redirect, get_object_or_404\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.contrib.auth.decorators <span class=\"hljs-keyword\">import<\/span>  login_required\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .models <span class=\"hljs-keyword\">import<\/span> Post\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .forms <span class=\"hljs-keyword\">import<\/span> PostForm\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">@login_required<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">delete_post<\/span><span class=\"hljs-params\">(request, id)<\/span>:<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>    queryset = Post.objects.filter(author=request.user)\n<\/span><\/mark><mark class='shcb-loc'><span>    post = get_object_or_404(queryset, pk=id)\n<\/span><\/mark><span class='shcb-loc'><span>    context = {<span class=\"hljs-string\">'post'<\/span>: post}    \n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'blog\/post_confirm_delete.html'<\/span>,context)\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">elif<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        post.delete()\n<\/span><\/span><span class='shcb-loc'><span>        messages.success(request,  <span class=\"hljs-string\">'The post has been deleted successfully.'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)        \n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">@login_required    <\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">edit_post<\/span><span class=\"hljs-params\">(request, id)<\/span>:<\/span>\n<\/span><\/span><mark class='shcb-loc'><span>    queryset = Post.objects.filter(author=request.user)\n<\/span><\/mark><mark class='shcb-loc'><span>    post = get_object_or_404(queryset, pk=id)\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        context = {<span class=\"hljs-string\">'form'<\/span>: PostForm(instance=post), <span class=\"hljs-string\">'id'<\/span>: id}\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,context)\n<\/span><\/span><span class='shcb-loc'><span>    \n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">elif<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        form = PostForm(request.POST, instance=post)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">if<\/span> form.is_valid():\n<\/span><\/span><span class='shcb-loc'><span>            form.save()\n<\/span><\/span><span class='shcb-loc'><span>            messages.success(request, <span class=\"hljs-string\">'The post has been updated successfully.'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">else<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>            messages.error(request, <span class=\"hljs-string\">'Please correct the following errors:'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,{<span class=\"hljs-string\">'form'<\/span>:form})\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">@login_required<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">create_post<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        context = {<span class=\"hljs-string\">'form'<\/span>: PostForm()}\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,context)\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">elif<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        form = PostForm(request.POST)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">if<\/span> form.is_valid():\n<\/span><\/span><span class='shcb-loc'><span>            form.save()\n<\/span><\/span><span class='shcb-loc'><span>            messages.success(request, <span class=\"hljs-string\">'The post has been created successfully.'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">else<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>            messages.error(request, <span class=\"hljs-string\">'Please correct the following errors:'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,{<span class=\"hljs-string\">'form'<\/span>:form})          \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>    posts = Post.objects.all()\n<\/span><\/span><span class='shcb-loc'><span>    context = {<span class=\"hljs-string\">'posts'<\/span>: posts  }\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/home.html'<\/span>, context)   \n<\/span><\/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<p>In both delete and update, we filter the post by the current user before passing it to the <code>get_object_or_404()<\/code> function.<\/p>\n\n\n\n<p>If you log in as Jane and attempt to edit a post that does not belong to Jane, you&#8217;ll get a 404 error. For example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"494\" height=\"478\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions.png\" alt=\"\" class=\"wp-image-5929\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions.png 494w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions-300x290.png 300w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/figure>\n\n\n\n<p>The 404 page:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"324\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions-404.png\" alt=\"\" class=\"wp-image-5930\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions-404.png 642w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-permissions-404-300x151.png 300w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><\/figure>\n\n\n\n<p>Second, modify the <code>home.html<\/code> template to hide the edit and delete links.<\/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\">{% extends 'base.html' %}\n\t\n{% block content %}\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>My Posts<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n\t{% for post in posts %}\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span>&gt;<\/span>{{ post.title }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span>&gt;<\/span>Published on {{ post.published_at | date:\"M d, Y\" }} by {{ post.author | title}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>{{ post.content }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t\t\n\t\t{% if request.user.is_authenticated and request.user == post.author %}\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\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 'post-edit' post.id %}\"<\/span>&gt;<\/span>Edit<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span> \n\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 'post-delete' post.id%}\"<\/span>&gt;<\/span>Delete<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span>&gt;<\/span>\n\t\t<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n\t\t{% endif %}\n\t\t\n\t{% endfor %}\n{% endblock content %}<\/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<h2 class=\"wp-block-heading\" id='removing-the-author-from-the-create-post-form'>Removing the author from the create post form <a href=\"#removing-the-author-from-the-create-post-form\" class=\"anchor\" id=\"removing-the-author-from-the-create-post-form\" title=\"Anchor for Removing the author from the create post form\">#<\/a><\/h2>\n\n\n\n<p>First, remove the <code>author<\/code> field from the <code>fields<\/code> of the <code>PostForm<\/code> class:<\/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.forms <span class=\"hljs-keyword\">import<\/span> ModelForm\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">from<\/span> .models <span class=\"hljs-keyword\">import<\/span> Post\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PostForm<\/span><span class=\"hljs-params\">(ModelForm)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Meta<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        model = Post\n<\/span><\/span><mark class='shcb-loc'><span>        fields = &#91;<span class=\"hljs-string\">'title'<\/span>,<span class=\"hljs-string\">'content'<\/span>]    \n<\/span><\/mark><\/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>The post-creation form will look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full border\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"402\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-post-form.png\" alt=\"\" class=\"wp-image-5932\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-post-form.png 502w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/djang-register-form-post-form-300x240.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/figure>\n\n\n\n<p>Second, modify the <code>create_post()<\/code> function in the <code>views.py<\/code> of the <code>blog<\/code> application to update the author of the post to the currently logged user:<\/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 shcb-code-table\"><span class='shcb-loc'><span><span class=\"hljs-meta\">@login_required<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title\">create_post<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> request.method == <span class=\"hljs-string\">'GET'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        context = {<span class=\"hljs-string\">'form'<\/span>: PostForm()}\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,context)\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">elif<\/span> request.method == <span class=\"hljs-string\">'POST'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>        form = PostForm(request.POST)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">if<\/span> form.is_valid():\n<\/span><\/span><mark class='shcb-loc'><span>            user = form.save(commit=<span class=\"hljs-literal\">False<\/span>)\n<\/span><\/mark><mark class='shcb-loc'><span>            user.author = request.user\n<\/span><\/mark><mark class='shcb-loc'><span>            user.save()\n<\/span><\/mark><span class='shcb-loc'><span>            messages.success(request, <span class=\"hljs-string\">'The post has been created successfully.'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'posts'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">else<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>            messages.error(request, <span class=\"hljs-string\">'Please correct the following errors:'<\/span>)\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-keyword\">return<\/span> render(request,<span class=\"hljs-string\">'blog\/post_form.html'<\/span>,{<span class=\"hljs-string\">'form'<\/span>:form})  \n<\/span><\/span><\/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<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>Subclass the <code>UserCreationForm<\/code> to create a custom Django registration form.<\/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=\"5917\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-registration\/\"\n\t\t\t\tdata-post-title=\"Django Registration\"\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=\"5917\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-registration\/\"\n\t\t\t\tdata-post-title=\"Django Registration\"\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 create a Django registration form that allows users to sign up.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":5531,"menu_order":11,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5917","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5917","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=5917"}],"version-history":[{"count":0,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5917\/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=5917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}