{"id":5555,"date":"2022-11-15T03:19:41","date_gmt":"2022-11-15T03:19:41","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=5555"},"modified":"2023-11-01T00:21:07","modified_gmt":"2023-11-01T00:21:07","slug":"django-templates","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/django-tutorial\/django-templates\/","title":{"rendered":"Django Templates"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to create Django templates, pass data from view functions to templates, and display the data in the templates.<\/p>\n\n\n\n<p class=\"note\">This tutorial begins where&nbsp;<a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-create-app\/\">creating a Django app<\/a>&nbsp;left off.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='introduction-to-the-django-templates'>Introduction to the Django templates <a href=\"#introduction-to-the-django-templates\" class=\"anchor\" id=\"introduction-to-the-django-templates\" title=\"Anchor for Introduction to the Django templates\">#<\/a><\/h2>\n\n\n\n<p><a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-create-app\/\">In the previous tutorial<\/a>, you learned how to return a <code>HttpResponse<\/code> with a <code>h1<\/code> tag from a view. To return a full HTML page, you&#8217;ll need to use a template.<\/p>\n\n\n\n<p class=\"note\">Note that it is possible to return a full HTML page by mixing the HTML with Python code. However, it is not practical and doesn&#8217;t scale well.<\/p>\n\n\n\n<p>A template is a file that contains the static and dynamic parts of a webpage. To generate the dynamic parts of the webpage, Django uses its specific template language called Django template language or DTL. <\/p>\n\n\n\n<p>The Django template engine renders templates that contain variables, constructs, tags, and filters.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='variables'>Variables <a href=\"#variables\" class=\"anchor\" id=\"variables\" title=\"Anchor for Variables\">#<\/a><\/h3>\n\n\n\n<p>A variable is surrounded by <code>{{<\/code> and <code>}}<\/code>. For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hi {{name}}, welcome back!<\/code><\/span><\/pre>\n\n\n<p>In this template, the <code>name<\/code> is a variable. If the value of the <code>name<\/code> variable is <code>John<\/code>, the Django template engine will render the above template to the following text:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hi John, welcome back!<\/code><\/span><\/pre>\n\n\n<p>If a variable is a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-dictionary\/\">dictionary<\/a>, you can access the items of the dictionary using the dot notation (<code>dict_name.key<\/code>). <\/p>\n\n\n\n<p>Suppose you have a <code>person<\/code> dictionary with two keys <code>name<\/code> and <code>email<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">person = {<span class=\"hljs-string\">'name'<\/span>: <span class=\"hljs-string\">'John'<\/span>, <span class=\"hljs-string\">'email'<\/span>: <span class=\"hljs-string\">'john@pythontutorial.net'<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&#8230; you can access the values of the <code>name<\/code> and <code>email<\/code> keys of the <code>person<\/code> dictionary in the template like this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">{{ person.name }}\n{{ person.email }}<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id='tags'>Tags <a href=\"#tags\" class=\"anchor\" id=\"tags\" title=\"Anchor for Tags\">#<\/a><\/h3>\n\n\n\n<p>Tags are responsible for outputting contents, serving a control structure if-else, for-loop, and getting data from a database.<\/p>\n\n\n\n<p>Tags are surrounded by <code>{%<\/code> and <code>%}<\/code>. For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">{% csrf_token %}<\/code><\/span><\/pre>\n\n\n<p>In this example, the <code>csrf_token<\/code> tag generates a token for preventing CSRF attacks.<\/p>\n\n\n\n<p>Some tags like <code>if-else<\/code> and <code>for-loop<\/code> require beginning and ending tags. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">{% <span class=\"hljs-keyword\">if<\/span> user.is_authenticated %}\nHi {{user.username}} \n{% <span class=\"hljs-keyword\">endif<\/span> %}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id='filters'>Filters <a href=\"#filters\" class=\"anchor\" id=\"filters\" title=\"Anchor for Filters\">#<\/a><\/h3>\n\n\n\n<p>Filters transform the contents of variables and tags argument. For example, to capitalize each word of a string, you use the <code>title<\/code> filter like this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">{{ name | title }}<\/code><\/span><\/pre>\n\n\n<p>If the value of the <code>name<\/code> variable is <code>john doe<\/code>, then the <code>title<\/code> filter will transform it to the following:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">John Doe<\/code><\/span><\/pre>\n\n\n<p>Some filters accept an argument. For example, to format a date of the <code>joined_date<\/code> variable in the <code>Y-m-d<\/code> format, you use the following filter:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">{{ joined_date | date: <span class=\"hljs-string\">\"Y-m-d\"<\/span> }}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here are the complete <a href=\"https:\/\/docs.djangoproject.com\/en\/4.2\/ref\/templates\/builtins\/\">built-in template tags and filters<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='comments'>Comments <a href=\"#comments\" class=\"anchor\" id=\"comments\" title=\"Anchor for Comments\">#<\/a><\/h3>\n\n\n\n<p>The comments will look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">{<span class=\"hljs-comment\"># This is a comment in the template #}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The Django template engine will not render text inside the comment blocks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='django-template-examples'>Django template examples <a href=\"#django-template-examples\" class=\"anchor\" id=\"django-template-examples\" title=\"Anchor for Django template examples\">#<\/a><\/h2>\n\n\n\n<p>First, create a new directory called <code>templates<\/code> inside the <code>blog<\/code> directory:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mkdir templates<\/code><\/span><\/pre>\n\n\n<p>Second, create a <code>blog<\/code> directory inside the <code>templates<\/code> directory:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cd templates\nmkdir blog<\/code><\/span><\/pre>\n\n\n<p class=\"note\">Note that the directory inside the <code>templates<\/code> directory must have the same name as the application name. In this example, the <code>blog<\/code> directory has the same name as the <code>blog<\/code> app of the Django project.<\/p>\n\n\n\n<p>Third, inside the <code>templates\/blog<\/code> directory create two template files <code>home.html<\/code> and <code>about.html<\/code> with the following contents.<\/p>\n\n\n\n<p>The <code>home.html<\/code> file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<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 class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <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 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 class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Home<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Home<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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>about.html<\/code> file:<\/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\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<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 class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <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 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 class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>About<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>About<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/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>It&#8217;s important to note that you should add the <code>blog<\/code> application to the <code>INSTALLED_APPS<\/code> list in the <code>settings.py<\/code> file to make the templates work. Typically, you do it immediately after <a href=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-create-app\/\">creating the new Django application<\/a>. <\/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\">INSTALLED_APPS = &#91;\n    <span class=\"hljs-comment\"># ...<\/span>\n    <span class=\"hljs-string\">'blog.apps.BlogConfig'<\/span>,\n]<\/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>Fourth, open the <code>views.py<\/code> file and change the <code>home()<\/code> and <code>about()<\/code> view functions to the following:<\/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 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>\n<\/span><\/span><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\">home<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'blog\/home.html'<\/span>)\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><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\">about<\/span><span class=\"hljs-params\">(request)<\/span>:<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'blog\/about.html'<\/span>)\n<\/span><\/mark><\/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>In this <code>views.py<\/code> file, we import the <code>render()<\/code> function from the <code>django.shortcuts<\/code>. <\/p>\n\n\n\n<p>The <code>render()<\/code> function accepts an <code>HttpRequest<\/code> object and a path to a template. It renders the template and returns an <code>HttpResponse<\/code> object.<\/p>\n\n\n\n<p>Fifth, run the Django development server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">python<\/span> <span class=\"hljs-selector-tag\">manage<\/span><span class=\"hljs-selector-class\">.py<\/span> <span class=\"hljs-selector-tag\">runserver<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, open the URL <code>http:\/\/127.0.0.1:8000\/<\/code> and the URL <code>http:\/\/127.0.0.1:8000\/about\/<\/code>, you&#8217;ll see full HTML pages that come from the <code>home.html<\/code> and <code>about.html<\/code> templates.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='passing-variables-to-a-template'>Passing variables to a template <a href=\"#passing-variables-to-a-template\" class=\"anchor\" id=\"passing-variables-to-a-template\" title=\"Anchor for Passing variables to a template\">#<\/a><\/h3>\n\n\n\n<p>We&#8217;ll create dummy blog post data and pass it to the <code>home.html<\/code> template. Later, you&#8217;ll learn how to get the post data from the database.<\/p>\n\n\n\n<p>The <code>views.py<\/code> will look like this:<\/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 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>\n<\/span><\/span><mark class='shcb-loc'><span>posts = &#91;\n<\/span><\/mark><mark class='shcb-loc'><span>    {\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'title'<\/span>: <span class=\"hljs-string\">'Beautiful is better than ugly'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'author'<\/span>: <span class=\"hljs-string\">'John Doe'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'content'<\/span>: <span class=\"hljs-string\">'Beautiful is better than ugly'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'published_at'<\/span>: <span class=\"hljs-string\">'October 1, 2022'<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    },\n<\/span><\/mark><mark class='shcb-loc'><span>    {\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'title'<\/span>: <span class=\"hljs-string\">'Explicit is better than implicit'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'author'<\/span>: <span class=\"hljs-string\">'Jane Doe'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'content'<\/span>: <span class=\"hljs-string\">'Explicit is better than implicit'<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'published_at'<\/span>: <span class=\"hljs-string\">'October 1, 2022'<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>    }\n<\/span><\/mark><mark class='shcb-loc'><span>]\n<\/span><\/mark><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><mark class='shcb-loc'><span>    context = {\n<\/span><\/mark><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'posts'<\/span>: posts\n<\/span><\/mark><mark class='shcb-loc'><span>    }\n<\/span><\/mark><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'blog\/home.html'<\/span>, context)\n<\/span><\/mark><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\">about<\/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\">'blog\/about.html'<\/span>)\n<\/span><\/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>How it works.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, create a new list (<code>posts<\/code>) that stores the dummy post data.<\/li>\n\n\n\n<li>Second, define a new dictionary <code>context<\/code> inside the <code>home()<\/code> function with the key <code>posts<\/code> and pass it to the <code>render()<\/code> function as the third argument.<\/li>\n<\/ul>\n\n\n\n<p>Inside <code>home.html<\/code> template, you can access the post data via the <code>posts<\/code> variable. <\/p>\n\n\n\n<p>The following <code>home.html<\/code> template that displays the posts:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<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 class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n\t<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\t<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\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Blog<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/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 }} by {{ post.author}}<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{% endfor %}\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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>How it works.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, use a <code>for<\/code> loop to iterate over the <code>posts<\/code> variable. The <code>for<\/code> loop ends with <code>endfor<\/code>. Both <code>for <\/code>and <code>endfor<\/code> are surrounded by <code>{%<\/code> and <code>%}<\/code>.<\/li>\n\n\n\n<li>Second, place the value of each item in the dictionary using dot notation (<code>.<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>If you save the <code>home.html<\/code> and open the URL <code>http:\/\/127.0.0.1:8000\/<\/code>, you&#8217;ll see the post data displayed on the page.<\/p>\n\n\n\n<p>Besides the <code>for<\/code> loop, you can use another conditional statement like <code>if-else<\/code>. For example:<\/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><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>\t<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>\t<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><mark class='shcb-loc'><span>\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>{% if title %} {{title}} {% else %} Blog {% endif %}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<\/span><\/mark><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{% for post in posts %}\n<\/span><\/span><span class='shcb-loc'><span>\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<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span>&gt;<\/span>Published on {{ post.published_at }} by {{ post.author}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\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<\/span><\/span><span class='shcb-loc'><span>\t{% endfor %}\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<p>This example uses an <code>if-else<\/code> statement to show the <code>title<\/code> variable if it is available or the <code>Blog<\/code> otherwise. <\/p>\n\n\n\n<p>To pass the <code>title<\/code> variable to the <code>home.html<\/code> template, you add a new entry to the <code>context<\/code> dictionary with the key <code>title<\/code> in the <code>home()<\/code> function like this:<\/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 shcb-code-table\"><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>    context = {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">'posts'<\/span>: posts,\n<\/span><\/span><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'title'<\/span>: <span class=\"hljs-string\">'Zen of Python'<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>    }\n<\/span><\/span><mark class='shcb-loc'><span>    <span class=\"hljs-keyword\">return<\/span> render(request, <span class=\"hljs-string\">'blog\/home.html'<\/span>, context)\n<\/span><\/mark><\/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>If you refresh the home URL <code>http:\/\/127.0.0.1:8000\/<\/code>, you&#8217;ll see the new title.<\/p>\n\n\n\n<p>Typically, a website has some common sections like a header, footer, and sidebar. To avoid repeating them in every template, you can use a base template.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='creating-a-base-template'>Creating a base template <a href=\"#creating-a-base-template\" class=\"anchor\" id=\"creating-a-base-template\" title=\"Anchor for Creating a base template\">#<\/a><\/h2>\n\n\n\n<p>First, create a new <code>templates<\/code> directory in the project directory (not the <code>blog<\/code> app):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext shcb-code-table\"><span class='shcb-loc'><span>\u251c\u2500\u2500 blog\n<\/span><\/span><span class='shcb-loc'><span>\u251c\u2500\u2500 db.sqlite3\n<\/span><\/span><span class='shcb-loc'><span>\u251c\u2500\u2500 django_project\n<\/span><\/span><span class='shcb-loc'><span>\u251c\u2500\u2500 manage.py\n<\/span><\/span><mark class='shcb-loc'><span>\u251c\u2500\u2500 templates\n<\/span><\/mark><span class='shcb-loc'><span>\u2514\u2500\u2500 users\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\">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>Next, add the template directory to the <code>TEMPLATES<\/code> option in the <code>settings.py<\/code> file of the project:<\/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>TEMPLATES = &#91;\n<\/span><\/span><span class='shcb-loc'><span>    {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">'BACKEND'<\/span>: <span class=\"hljs-string\">'django.template.backends.django.DjangoTemplates'<\/span>,\n<\/span><\/span><mark class='shcb-loc'><span>        <span class=\"hljs-string\">'DIRS'<\/span>: &#91;BASE_DIR \/ <span class=\"hljs-string\">'templates'<\/span> ],\n<\/span><\/mark><span class='shcb-loc'><span>        <span class=\"hljs-string\">'APP_DIRS'<\/span>: <span class=\"hljs-literal\">True<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">'OPTIONS'<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'context_processors'<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">'django.template.context_processors.debug'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">'django.template.context_processors.request'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">'django.contrib.auth.context_processors.auth'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">'django.contrib.messages.context_processors.messages'<\/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>    },\n<\/span><\/span><span class='shcb-loc'><span>]\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 class=\"note\">Note that <code>BASE_DIR<\/code> is a <code><a href=\"https:\/\/www.pythontutorial.net\/python-standard-library\/python-path\/\">Path<\/a><\/code> object that comes from the <code>pathlib<\/code> built-in module. The forward-slash <code>\/<\/code> is an operator that concatenates the <code>BASE_DIR<\/code> object with the <code>'templates'<\/code> string. This feature is called <a href=\"https:\/\/www.pythontutorial.net\/python-oop\/python-operator-overloading\/\">operator overloadin<\/a>g in Python.<\/p>\n\n\n\n<p>Then, create <code>base.html<\/code> in the <code>templates<\/code> directory with the following code:<\/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><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><mark class='shcb-loc'><span>        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>{% if title %} {{title}} {% else %} Blog {% endif %}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<\/span><\/mark><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><mark class='shcb-loc'><span>        {% block content %}\n<\/span><\/mark><mark class='shcb-loc'><span>        {% endblock %}\n<\/span><\/mark><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>The <code>base.html<\/code> is served as the base template for other templates. The name of the base template can be anything like <code>main.html<\/code>.<\/p>\n\n\n\n<p>After that, change the <code>home.html<\/code> template inside the <code>templates\/blog<\/code> directory as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" 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\">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<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<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">small<\/span>&gt;<\/span>Published on {{ post.published_at }} by {{ post.author}}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">small<\/span>&gt;<\/span>\n\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{% endfor%}\n{% endblock %}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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>home.html<\/code> extends the <code>base.html<\/code> template using the <code>extends<\/code> tag. The <code>home.html<\/code> template has its section for the <code>content<\/code> block.<\/p>\n\n\n\n<p>Also, change the <code>about.html<\/code> template that extends the <code>base.html<\/code> template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" 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\">h1<\/span>&gt;<\/span>About<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n{% endblock content %}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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>Finally, restart the Django development server and open URL <code>http:\/\/127.0.0.1:8000\/<\/code>, and you&#8217;ll see the changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='configure-static-files'>Configure static files <a href=\"#configure-static-files\" class=\"anchor\" id=\"configure-static-files\" title=\"Anchor for Configure static files\">#<\/a><\/h2>\n\n\n\n<p>The static files are CSS, JavaScript, and image files that you use in the templates. To use the static files in the templates, you follow these steps:<\/p>\n\n\n\n<p>First, create a <code>static<\/code> directory inside the project directory:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">mkdir <span class=\"hljs-keyword\">static<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The project directory will look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">blog<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">db<\/span><span class=\"hljs-selector-class\">.sqlite3<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">manage<\/span><span class=\"hljs-selector-class\">.py<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">mysite<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">static<\/span>\n\u2514\u2500\u2500 <span class=\"hljs-selector-tag\">templates<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, set the <code>STATICFILES_DIRS<\/code>  in the <code>settings.py<\/code> after the <code>STATIC_URL<\/code> file so that Django can find the static files in the static directory:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Python\" data-shcb-language-slug=\"python\"><span><code class=\"hljs language-python\">STATIC_URL = <span class=\"hljs-string\">'static\/'<\/span>\nSTATICFILES_DIRS = &#91;BASE_DIR \/ <span class=\"hljs-string\">'static'<\/span>]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><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>Third, create three directories <code>js<\/code>, <code>css<\/code>, and <code>images<\/code> directory inside the <code>static<\/code> directory:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">\u251c\u2500\u2500 static\n|  \u251c\u2500\u2500 css\n|  \u251c\u2500\u2500 images\n|  \u2514\u2500\u2500 js<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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>Fourth, create <code>style.css<\/code> inside the CSS directory with the following contents. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">h1<\/span>{\n\t<span class=\"hljs-attribute\">color<\/span>:<span class=\"hljs-number\">#0052EA<\/span>\n}\n\n<span class=\"hljs-selector-tag\">form<\/span> {\n\t<span class=\"hljs-attribute\">max-width<\/span>: <span class=\"hljs-number\">400px<\/span>;\n}\n<span class=\"hljs-selector-tag\">label<\/span>, <span class=\"hljs-selector-tag\">input<\/span>, <span class=\"hljs-selector-tag\">textarea<\/span>, <span class=\"hljs-selector-tag\">select<\/span>{\n\t<span class=\"hljs-attribute\">display<\/span>:block;\n\t<span class=\"hljs-attribute\">width<\/span>:<span class=\"hljs-number\">100%<\/span>;\n}\n\n<span class=\"hljs-selector-tag\">input<\/span><span class=\"hljs-selector-attr\">&#91;type=<span class=\"hljs-string\">\"submit\"<\/span>]<\/span>{\n\t<span class=\"hljs-attribute\">display<\/span>:inline-block;\n\t<span class=\"hljs-attribute\">width<\/span>:auto;\n}\n\n<span class=\"hljs-selector-class\">.errorlist<\/span> {\n\t<span class=\"hljs-attribute\">padding<\/span>:<span class=\"hljs-number\">0<\/span>;\n\t<span class=\"hljs-attribute\">margin<\/span>:<span class=\"hljs-number\">0<\/span>;\n}\n<span class=\"hljs-selector-class\">.errorlist<\/span> <span class=\"hljs-selector-tag\">li<\/span>{\n\t<span class=\"hljs-attribute\">color<\/span>:red;\n\t<span class=\"hljs-attribute\">list-style<\/span>:none;\n}\n\n<span class=\"hljs-selector-class\">.alert<\/span>{\n\t<span class=\"hljs-attribute\">padding<\/span>:<span class=\"hljs-number\">0.5rem<\/span>;\t\n}\n\n<span class=\"hljs-selector-class\">.alert-success<\/span>{\n\t<span class=\"hljs-attribute\">background-color<\/span>: <span class=\"hljs-number\">#dfd<\/span>\n}\n<span class=\"hljs-selector-class\">.alert-error<\/span>{\n\t<span class=\"hljs-attribute\">background-color<\/span>:<span class=\"hljs-number\">#ba2121<\/span>;\n\t<span class=\"hljs-attribute\">color<\/span>:<span class=\"hljs-number\">#fff<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"note\">Note that we use only some simple CSS rules to make the tutorials easier to follow. Our primary focus is Django, not CSS or JavaScript.<\/p>\n\n\n\n<p>Fifth, create the <code>app.js<\/code> inside the <code>js<\/code> directory with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n  alert(<span class=\"hljs-string\">'Welcome to my site!'<\/span>);\n}, <span class=\"hljs-number\">3000<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This code <a href=\"https:\/\/www.javascripttutorial.net\/javascript-bom\/javascript-alert\/\">shows an alert<\/a> <a href=\"https:\/\/www.javascripttutorial.net\/javascript-bom\/javascript-settimeout\/\">after the page is loaded for 3 seconds<\/a>.<\/p>\n\n\n\n<p>Sixth, edit the <code>base.html<\/code> template to load the <code>style.css<\/code> and <code>app.js<\/code> files:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" 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><mark 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><\/mark><mark 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><\/mark><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>    {%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\">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-25\"><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>Seventh, restart the Django development server, open the URL <code>http:\/\/127.0.0.1:8000\/<\/code>, and you&#8217;ll see that the color of the heading changes according to the CSS rule.<\/p>\n\n\n\n<p>Also, you&#8217;ll see an alert after about 3 seconds because the <code>JavaScript<\/code> code in the <code>app.js<\/code> runs:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"665\" height=\"185\" src=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/django-start-project-js.png\" alt=\"django start project - js\" class=\"wp-image-5748\" srcset=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/django-start-project-js.png 665w, https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2022\/11\/django-start-project-js-300x83.png 300w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/figure>\n\n\n\n<p>Since we&#8217;re not focusing on the JavaScript part, you can remove the code in the <code>app.js<\/code> file to continue the next tutorial.<\/p>\n\n\n\n<p class=\"note\"><a href=\"https:\/\/www.pythontutorial.net\/wp-content\/uploads\/2023\/01\/django_project_3.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Download the Django Project source code<\/a><\/p>\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>A Django template contains both static and dynamic parts of a web page.<\/li>\n\n\n\n<li>Django uses Django Template Language (DTL) by default to create templates.<\/li>\n\n\n\n<li>Use <code>{{ variable_name }}<\/code> to display the value of the <code>variable_name<\/code> in a template.<\/li>\n\n\n\n<li>Use <code>{% control_tag %}<\/code> to include a control tag in a template.<\/li>\n\n\n\n<li>Use the <code>static<\/code> tag to load the static files including CSS, JavaScript, and images.<\/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=\"5555\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-templates\/\"\n\t\t\t\tdata-post-title=\"Django Templates\"\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=\"5555\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/django-tutorial\/django-templates\/\"\n\t\t\t\tdata-post-title=\"Django Templates\"\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 Django templates and how to pass variables from view functions to them.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":5531,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5555","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5555","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=5555"}],"version-history":[{"count":0,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/5555\/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=5555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}