Django for beginners: understanding the Django project structure

Django is a very nice framework to use, once you’re familiar with the various components. This article will go through what each component is & how we use all those components to build super awesome web apps.

When we look at our Django project, we will see something like the below. The key thing to note here is that we have two separate sub directories – one which holds all the settings for Django itself and another that stores the settings for our app. Let’s look at each item in detail.

Django project folder:

In the main project folder, I have defined a folder called /static. This is where all the static content for the website is held (e.g. CSS, Javascript, Images, etc..). We will see in how Django knows what this folder is used for.

Next, we have – this is how we manage our Django project. As an example, when you make a change to your schema in your data models, they will not take effect until you migrate them, using the file (python3 makemigrations).

Django project:

The two key features of the Django project directory are and defines all the settings related to your Django project. This includes the below. Without this file being correct, your Django application will never work. Additionally, without understanding the contents of the file, your Django application may remain unsecure & exposed to being hacked. We will go through security settings in detail in the next post:

  • Database configuration (usernames, passwords, database names)
  • App security settings (e.g. session & cookie settings)
  • Static directory path
  • Path to HTML templates folder
  • Etc.. maps url patterns to particular views (HTML templates & functions). This without the correctly defined, users will be unable to use any of the functionality on your Django website.


The app folder is where things get interesting. We’re now not looking at Django specific things, we’re looking at things related to your app and the functionality you want to build. The file is really the cornerstone to your app functionality. With this, we say ‘when a particular URL is requested/button clicked etc…., this is the data which should be returned. For example, when a user visits the /my-orders page of your web app, all of their orders should be retrieved from the database & returned to the view, to be injected into the HTML page.

The file defines your data models – the column names & data types that are required. For example, in a users table, you may choose to have the columns below, these would be defined in the file:

  • User ID (integer)
  • Username (string)
  • etc..

The file is where we register the models defined in, so that they show up in our admin view – this lets us login & administer the data visually, if we wish,

We also create a /templates folder, which is where all of our HTML files will live. So, when the user requests a URL, Django checks; directs the request to a specific view in and the data returned from the view is injected into the HTML template.