9 How to Use Django Database Backend and Migrations

At the moment, when we run the development server using python manage.py runserver there is a red message that says that (in my case) there are 13 unapplied migrations. This means that the database currently configured by your Django project is not in allignment with the rest of the project. At this point, it is the default models given to us by Django that do not yet have a place in the database.

To reflect the changes in Django migrations run python manage.py makemigrations. Migrations are still written in Python, are stored in a migrations folder for each app that has migrations and give Django the ability to figure out what SQL needs to be executed on the database itself. The next step is to execute it.

Apply all changes reflected by your Django migrations using python manage.py migrate.

Once the migrations have been applied successfully (denoted by OK in green for each migration), the database should be up to date. We can now run python manage.py runserver again without error - however, we can’t login with an account and nor can we create one through the website’s own registration process (as it doesn’t have one).

To create an administrative (or superuser) account, run the Django createsuperuser management command:

python manage.py createsuperuser

Add the required username and password data when prompted. You can also optionally add an email address to be associated with the account.

Run the development server again and you should be able to enter your new account information. You should be directed to /accounts/profile and see a HTTP 404 error. This is because the urls we have defined do not match /accounts/profile.

Let’s quickly resolve that error by changing the URL in the settings (not a urls.py as you might expect). At the end of the tutorial/settings.py file add:

LOGIN_REDIRECT_URL = '/account/'

You should now see the accounts/static/accounts/home.html template being rendered in the browser as dictated by the view, which in turn was chosen by our url configuration.