27. Django templating
27.01 Introduction
Django templating is the way in which we can use code to automatically construct html pages that we’re going to send to users.
27.02 HTML refresher
Points worth remembering:
- All HTML documents must start with a <!DOCTYPE> declaration.
The declaration is not an HTML tag. It is an “information” to the browser about what document type to expect.
- You should always include the lang attribute inside the <html> tag, to declare the language of the Web page. This is meant to assist search engines and browsers.
A sample HTML page for our genedata website:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="description" content="Toy Gene data website"> <meta name="keywords" content="HTML,gene,genes,advanced,web,development"> <meta name="author" content="D. Smith"> </head> <body> <div id="header"> <img src="https://upload.wikimedia.org/wikipedia/commons/e/e0/202002_Laboratory_instrument_dna.svg" alt="dna logo" width="50px" height="50px"> <h1>Gene Browser</h1> </div> <div id="navigation"> <a href="/">Home</a> </div> <div id="content"> <p>This is some placeholder content before we develop the application</p> </div> <div id="footer"> <hr> <p>Author: D. Smith, 2021</p> </div> </body> </html>
27.03 Creating a template
We can now start to chop this page up into “static” fragments which won’t change from page to page but can be loaded up into the various new pages we serve. For example we can create the following files:
header.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="description" content="Toy Gene data website"> <meta name="keywords" content="HTML,gene,genes,advanced,web,development"> <meta name="author" content="D. Smith"> </head> <body> title.html <div id="header"> <img src="https://upload.wikimedia.org/wikipedia/commons/e/e0/202002_Laboratory_instrument_dna.svg" alt="dna logo" width="50px" height="50px"> <h1>Gene Browser</h1> </div> <div id="navigation"> <a href="/">Home</a> </div> footer.html <div id="footer"> <hr> <p>Author: D. Smith, 2021</p> </div> </body> </html>
We can now create a base template, called base.html, for the entire application, using the Django templating language to include these new page fragments:
base.html {% include "./header.html" %} {% include "./title.html" %} <div class="content"> {% block content %}Didn't render content{% endblock %} </div> {% include "./footer.html" %}
We’ve used an include tag to include pages, and a block content tag to render the content for the page – this hasn’t been created yet.
We can come back now and revisit the index.html page for the application.
We use this command to tell it where the template is:
{% extends "genedata/base.html" %}
In base.html we called the content block “content”. So around the content we want to use we can put these tags:
{% block content %} {% endblock %}
The new index.html page would look something like this:
{% extends "genedata/base.html" %} {% block content %} <h1>D.Bucha Genes</h1> <table> <tr><th>Gene ID</th></tr> {% for gene in genes %} <tr><td><a href="/gene/{{gene.pk}}" >{{gene}}</a></td></tr> {% endfor %} </table> <h2>Select gene location</h2> <a href="/list/Chromosome">Chromosome</a> OR <a href="/list/Plasmid">Plasmid</a> <h2>Show Positive Chromosome</h2> <a href="/poslist/">Show This List</a> {% endblock %}
We can now work on our virtual environment to see this in action. Just a reminder that in Windows 10 we need to open a CMD window and type the following:
$ md bioweb $ cd bioweb $ python -m venv env $ env\Scripts\activate $ cd bioweb $ python manage.py runserver
Then visit http://127.0.0.1:8000/ to see it working. You should be able to see the index.html page as before, but this time with an image logo and new footer.
27.04 Creating tags
We can also create our own template tags. Let’s create a new folder in the genedata folder called templatetags and then within here some new files:
__init__.py mytags.py
In footer.html we could replace 2021 with the actual date. So we can do this:
<p>Author: D. Smith, {% todays_date %}</p>
In mytags.py we can type this script, with a function which we’ve called todays_date (matching the tag):
import datetime from django import template register = template.Library() @register.simple_tag def todays_date(): return datetime.datetime.now().strftime("%d %b, %Y")
We need to also ensure that footer.html is aware of our template tags, so at the start of the file add:
{% load mytags %}
mytags in the template instruction above needs to match the name of the file.
27.05 Adding templating to other pages
We’ve added templating to our index.html page but we’ve got some other pages in our application that we need to add the templating too.
In gene.html we can delete the html, head and body tags – everything before the h1 line, and type:
{% extends "genedata/base.html" %} {% block content %}
and at the end, again removing body and html tags and putting:
{% endblock %}
This will now render the gene pages with the CSS that we added earlier. We can do the same on our list.html page as well.
Wednesday 10 November 2021, 633 views
Next post: 28. Adding CSS to the template Previous post: 26. Deleting and updating records
Advanced Web Development index
- 38. Writing API tests
- 37. Testing in Django
- 36. Class-based views in the Django REST framework
- 35. Building a RESTful web service in Django
- 34. Introduction to CRUD, REST and APIs
- 33. Refactoring with generic views in Django
- 32. Django validators
- 31. Django forms (2) – using the ModelForm class
- 30. Django forms (1)
- 29. JavaScript basics
- 28. Adding CSS to the template
- 27. Django templating
- 26. Deleting and updating records
- 25. Joins, filters and chaining commands
- 24. Using the ORM in views.py
- 23. Adding to the database by writing a script
- 22. Adding to the database with Django Admin
- 21. Migrations
- 20. ORM – work through example
- 19. An introduction to the Object-Relational Mapper
- 18. Altering the database
- 17. SQL functions and summaries
- 16. SQL Query performance
- 15. Queries and table joins in SQL
- 14. Inserts and queries in SQL
- 13. Good practice in relational database design
- 12. Limitations to database modelling
- 11. Building a database using SQL
- 10. Introduction to PostgreSQL
- 9. How to start writing a new application in Django
- 8. Building a lightweight project
- 7. Django URLs
- 6. Django templates
- 5. Django models
- 4. Django views
- 3. Creating a new hello app
- 2. Creating a new virtual environment
- 1. Setting up Django
Leave a Reply