Templates
Templates#
HTML with special tagsfor data, loops and conditions
Templates are also extendable
Where#
Templates looks for templates directory inside the app directory by default
Also expects a folder inside templates with the same name as the app
Call the template my_file.html
Better Way#
- Is add global templates, in the root of the project add a
templatesfolder - then add it to the
DIRSinsettings.py
Use Render#
from django.shortcuts import render
return render(request, 'home.html', {context: context})
Template tags#
{% and %} that allow you to write python within
Use {{ var_name }} to print out a variable
Inheriting#
- Extending a parent template allows overridable
blocks - Name a block
<title>{% block title %}{% endblock %}</title>Extends:{% extends "layout.html" %}Then set block content
Displaying content from parent block#
Use {{ block.super }}
{% block content %}
{{ block.super }}
<p>The previous example text is replaced by this text.</p>
{% endblock %}
URLs#
Named Url#
Give your url’s in urls.py a name
url(r'^$', views.courselist, name='list')
Setting parameters
<h3><a href="{% url 'step' course_pk=step.course.pk step_pk=step.pk %}">{{ step.title}}</a></h3>
Filters#
{{ myVar | filter}
linebreaks- converting linebreaks into valid html-
join- joins a list with a betweenmyArr|join:", " -
length- get length (sometimes better to use built in methods) pluralize- adds asto a certain wordstep{{ course.set_set.count| pluralize}}wordcount- counts number of wordsunordered_list- no closing tagged, unordered listapnumber- add associated press style numberstruncatewords:n- cuts off after that many words and adds an ellipsisdate:format- egdate:"F j, Y"for human readable datesurlize- Converts an email or web address into a linksafe- output raw html - tell django it is safe
Can also be done in other filters with marksafe
In settings add to INSTALLED_APPS
'django.contrib.humanize',
at top of template load humanize
{% load humanize %}
Good use case for custom filters:
- Convert markdown to html
Arguments to custom tags#
Arguments are seperated by a space
{% is_conjugate test_var %}
Load multiple filters#
{% load humanize course_extras %}
Chaining#
You can chain filters
{{ word|lower|capfirst }}
Applied in order, applied to result of one before
With#
Shorten a long variable
{% with con=step.content %}
{{ con|linebreaks }}
{% endwith %}
If#
Conditionally show a template
{% if course.description %}
{{ course.description }}
{% endif %}
Can also use an else
{% if course.description|wordcountt <= 5 %}
{{ course.description }}
{% else %}
{{ course.description|truncatewords:5 }}
{% endif %}
Static files#
Remember to let django know you will be using static with:
{% load static from staticfiles %}
Custom template tags#
Requires a folder called templatetags in the app
Add the __init__.py file to recognise as a python package
Follow this Custom Template tag Guide
This makes the code more readable and DRY
So important to use these
Inclusion tag#
Different from a simple tag as it includes data as a whole other template
These are powerful
Project wide static files#
best location: project/assets/css/*.css
App specific static files#
project/app_name/static/app_name/css/*.css
project/app_name/static/app_name/images/*.jpg
project/app_name/static/app_name/js/*.js
App specific css should not be used on pages not within the app itself