This tutorial explains how to add a favicon to a Django website. The trick is it requires configuring your static
files properly.
To start things off, create a local directory for your code. This can exist anywhere easily accessible but if you're on a Mac (as I am) the Desktop
is a convenient choice. Navigate there from the command line and create a new directory called favicon
, then change into it.
$ cd ~/Desktop
$ mkdir favicon && cd favicon
Now install Django with Pipenv and start the virtual environment with the shell
command. (If you need help installing it see here). You'll know it works correctly because the directory name will be parentheses (favicon)
.
$ pipenv install django==3.0.4
$ pipenv shell
(favicon) $
Ok, so far so good. Next create a new Django project with the startproject
command called favicon_project
. Include a period .
at the end of the command so that a duplicate directory isn't created by Django.
(favicon) $ django-admin startproject favicon_project .
(favicon) $ python manage.py migrate
(favicon) $ python manage.py runserver
Go to http://127.0.0.1:8000/ and see the Django Welcome page.
Pages app
Now we'll add a basic homepage. This requires a dedicated app we'll call pages
. Stop the local server with the Control+c
command.
(favicon) $ python manage.py startapp pages
Add it to the bottom of the INSTALLED_APPS
configuration within favicon_project/settings.py
to notify Django of it.
# favicon_project/settings.py
INSTALLED_APPS = [
...
'pages.apps.PagesConfig', # new
]
We need a URL, a view, and a template for the homepage. While the actual order here is optional--you'll need all three--I prefer to start with URLs.
URLs
This means adding our pages
app to the top-level favicon_project/urls.py
file and setting a URL path for it. We don't want any URL changes so we'll use the empty string ''
for this. Also note that we must import include
on the second line as well.
# favicon_project/urls.py
from django.contrib import admin
from django.urls import path, include # new
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')), # new
]
For some reason Django's startapp
command does not generate a urls.py
file for us even though we almost need one. So create one now within pages
.
(favicon) $ touch pages/urls.py
And then populate it as follows, referencing a HomePageView
we will create in the next step.
# pages/urls.py
from django.urls import path
from .views import HomePageView
urlpatterns = [
path('', HomePageView.as_view(), name='home'),
]
Views
Now we're on to the view which we know will be called HomePageView
and can rely on Django's built-in TemplateView. Note that it references a template called home.html
that we've yet to create.
# pages/views.py
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
Templates
And finally our template. We could place this within pages
by creating a pages/templates/pages/
directory structure but I prefer creating a top-level templates
directory instead. Let's do that now and add our home.html
template.
(favicon) $ mkdir templates
(favicon) $ touch templates/home.html
Now we must tell Django to look here as well as in the app-level templates
directory. We do that by updating the DIRS
configuration within our settings.py
file.
# favicon_project/settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')], # new
...
}
]
The template itself can just say "Homepage" for now.
<!-- templates/home.html -->
<h1>Homepage</h1>
All set. Make sure the server is running.
(favicon) $ python manage.py runserver
Then check out our new homepage at http://127.0.0.1:8000/.
Static Files
How to add a favicon now? We must set up static files where it will live.
Django relies on the staticfiles app to manage static files from across our entire project. The startproject
command already comes with a STATIC_URL configuration, which sets the URL we use to reference static files.
We'll need to set up STATICFILES_DIRS which defines the location of static files in local development. In our project these will all live within a top-level static
directory.
# favicon_project/settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),] # new
Create a local static
folder for our favicon stopping the local server Control+c
if necessary.
(favicon) $ mkdir static
Favicon
There are any number of favicon generators available online. If you want one to use in this project, you can download it here.
Move this file into your project within the static
directory so it should be static/favicon.ico
.
For the final step, update our template so that we include load static
at the top and then add an href
for our favicon.ico
file.
<!-- templates/home.html -->
{% load static %}
<!doctype html>
<html lang="en">
<head>
<title>Django Favicon Tutorial</title>
<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
</head>
<body>
<h1>Homepage</h1>
</body>
</html>
Start up the server again with python manage.py runserver
and refresh the page at http://127.0.0.1:8000/.
Boom! There's our favicon.
Top comments (0)