This chapter covers how to properly configure your computer to work on Django projects. We start with an overview of the command line and how to install the latest version of Django and Python. Then we discuss virtual environments, git, and working with a text editor. By the end of this chapter you’ll be ready to create and modify new Django projects in just a few keystrokes.

The Command Line

The command line is a powerful, text-only view of your computer. As developers we will use it extensively throughout this book to install and configure each Django project.

On a Mac, the command line is found in a program called Terminal. To find it, open a new Finder window, open the Applications directory, scroll down to open the Utilities directory, and double-click the application called Terminal.

On Windows machines there are actually two built-in command shells: the Command shell and PowerShell. You should use PowerShell, which is the more powerful of the two.

Going forward when the book refers to the “command line” it means to open a new console on your computer, using either Terminal or PowerShell.

While there are many possible commands we can use, in practice there are six used most frequently in Django development:

  • cd (change down a directory)
  • cd .. (change up a directory)
  • ls (list files in your current directory on Mac)
  • dir (list files in your current directory on Windows)
  • pwd (print working directory)
  • mkdir (make directory)
  • touch (create a new file on Mac)

Open your command line and try them out. The dollar sign ($) is our command line prompt: all commands in this book are intended to be typed after the $ prompt.

For example, assuming you’re on a Mac, let’s change into our Desktop directory.

$ cd ~/Desktop

Note that our current location, ~/Desktop, is automatically added before our command line prompt. To confirm we’re in the proper location we can use pwd which will print out the path of our current directory.

~/Desktop $ pwd

On my Mac computer this shows that I’m using the user wsv and on the desktop for that account.

Now let’s create a new directory with mkdir, cd into it, and add a new file index.html with the touch command. Note that Windows machines unfortunately do not support a native touch command. In future chapters when instructed to create a new file, do so within your text editor of choice.

~/Desktop $ mkdir new_folder
~/Desktop $ cd new_folder
~/Desktop/new_folder $ touch index.html

Now use ls to list all current files in our directory. You’ll see there’s just the newly created index.html.

~/Desktop/new_folder $ ls

As a final step, return to the Desktop directory with cd .. and use pwd to confirm the location.

~/Desktop/new_folder $ cd ..
~/Desktop $ pwd

Advanced developers can use their keyboard and command line to navigate through their computer with ease. With practice this approach is much faster than using a mouse.

In this book I’ll give you the exact instructions to run–you don’t need to be an expert on the command line–but over time it’s a good skill for any professional software developer to develop. A good free resource for further study is the Command Line Crash Course.

Install Python 3

It takes some configuration to properly install Python 3 on a Mac, Windows, Linux, or Chromebook computer and there are multiple approaches. Many developers–especially beginners–follow the advice on the official Python website to download distinct versions of Python directly onto their computer and then adjust the PATH variable accordingly.

The problem with this approach is that updating the PATH variable correctly is tricky, by downloading Python directly updates are harder to maintain, and there are now much easier ways to install and start using Python quickly.

I host a dedicated website,, with up-to-date guides for installing Python 3 on Mac, Windows, or Linux computers. Please refer there to install Python correctly on your local machine.

Virtual Environments

Virtual environments are an indispensable part of Python programming. They are an isolated container containing all the software dependencies for a given project. This is important because by default software like Python and Django is installed in the same directory. This causes a problem when you want to work on multiple projects on the same computer. What if ProjectA uses Django 3.1 but ProjectB from last year is still on Django 2.2? Without virtual environments this becomes very difficult; with virtual environments it’s no problem at all.

There are many areas of software development that are hotly debated, but using virtual environments for Python development is not one. You should use a dedicated virtual environment for each new Python project.

In this book we will use Pipenv to manage virtual environments. Pipenv is similar to npm and yarn from the JavaScript/Node ecosystem: it creates a Pipfile containing software dependencies and a Pipfile.lock for ensuring deterministic builds. “Determinism” means that each and every time you download the software in a new virtual environment, you will have exactly the same configuration.

Sebastian McKenzie, the creator of Yarn which first introduced this concept to JavaScript packaging, has a concise blog post explaining what determinism is and why it matters. The end result is that we will create a new virtual environment with Pipenv for each new Django Project.

To install Pipenv we can use pip3 which Homebrew automatically installed for us alongside Python 3.

$ pip3 install pipenv

Install Django

To see Pipenv in action, let’s create a new directory and install Django. First navigate to the Desktop, create a new directory django, and enter it with cd.

$ cd ~/Desktop
$ mkdir django
$ cd django

Now use Pipenv to install Django. Note the use of ~= which will ensure security updates for Django, such as 3.1.1, 3.1.2, and so on.

$ pipenv install django~=3.1.0

If you look within our directory there are now two new files: Pipfile and Pipfile.lock. We have the information we need for a new virtual environment but we have not activated it yet. Let’s do that with pipenv shell.

$ pipenv shell

If you are on a Mac you should now see parentheses around the name of your current directory on your command line which indicates the virtual environment is activated. Since we’re in a django directory that means we should see (django) at the beginning of the command line prompt. Windows users will not see the shell prompt. If you can run django-admin startproject in the next section then you know your virtual environment has Django installed properly.

(django) $

This means it’s working! Create a new Django project called config with the following command. Don’t forget that period . at the end.

(django) $ django-admin startproject config .

It’s worth pausing here to explain why you should add a period (.) to the command. If you just run django-admin startproject config then by default Django will create this directory structure:

└── config
    ├── config
    │   ├──
    │   ├──
    │   ├──
    │   ├──
    │   └──

See how it creates a new directory config and then within it a file and a config directory? That feels redundant to me since we already created and navigated into a django directory on our Desktop. By running django-admin startproject config . with the period at the end–which says, install in the current directory–the result is instead this:

├── config
│   ├──
│   ├──
│   ├──
│   ├──
│   └──

The takeaway is that it doesn’t really matter if you include the period or not at the end of the command, but I prefer to include the period and so that’s how we’ll do it in this book.

As you progress in your journey learning Django, you’ll start to bump up more and more into similar situations where there are different opinions within the Django community on the correct best practice. Django is eminently customizable, which is a great strength, however the tradeoff is that this flexibility comes at the cost of seeming complexity. Generally speaking it’s a good idea to research any such issues that arise, make a decision, and then stick with it!

Now let’s confirm everything is working by running Django’s local web server.

(django) $ python runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until
you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python migrate' to apply them.

August 3, 2020 - 14:52:27
Django version 3.1, using settings 'config.settings'
Starting development server at
Quit the server with CONTROL-C.

Don’t worry about the text in red about “18 unapplied migrations.” We’ll get to that shortly but the important part, for now, is to visit and make sure the following image is visible:

Django welcome page

To stop our local server type Control+c. Then exit our virtual environment using the command exit.

(django) $ exit

We can always reactivate the virtual environment again using pipenv shell at any time.

We’ll get lots of practice with virtual environments in this book so don’t worry if it’s a little confusing right now. The basic pattern is to install new packages with pipenv, activate them with pipenv shell, and then exit when done.

It’s worth noting that only one virtual environment can be active in a command line tab at a time. In future chapters we will be creating a brand new virtual environment for each new project so either make sure to exit your current environment or open up a new tab for new projects.

Install Git

Git is an indispensable part of modern software development. It is a version control system which can be thought of as an extremely powerful version of track changes in Microsoft Word or Google Docs. With git, you can collaborate with other developers, track all your work via commits, and revert to any previous version of your code even if you accidentally delete something important!

On a Mac, because HomeBrew is already installed we can simply type brew install git on the command line:

$ brew install git

On Windows you should download Git from Git for Windows. Click the “Download” button and follow the prompts for installation.

Once installed, we need to do a one-time system set up to configure it by declaring the name and email address you want associated with all your Git commits. Within the command line console type the following two lines. Make sure to update them your name and email address.

$ git config --global "Your Name"
$ git config --global ""

You can always change these configs later if you desire by retyping the same commands with a new name or email address.

Text Editors

The final step is our text editor. While the command line is where we execute commands for our programs, a text editor is where the actual code is written. The computer doesn’t care what text editor you use–the end result is just code–but a good text editor can provide helpful hints and catch typos for you.

Experienced developers often prefer using either Vim or Emacs, both decades-old, text-only editors with loyal followings. However each has a steep learning curve and requires memorizing many different keystroke combinations. I don’t recommend them for newcomers.

Modern text editors combine the same powerful features with an appealing visual interface. My current favorite is Visual Studio Code which is free, easy to install, and enjoys widespread popularity. If you’re not already using a text editor, download and install Visual Studio Code now.


Phew! Nobody really likes configuring a local development environment but fortunately it’s a one-time pain. We have now learned how to work with virtual environments and installed the latest version of Python and git. Everything is ready for our first Django app.

Continue on to Chapter 2: Hello World app.