Published 2021-03-07.
Last modified 2021-06-09.
Time to read: 1 minutes.
django collection.
When most people discuss Django templates they are referring to views that have special markup that enables variable substitution and simple control structures. This article discusses a different type of Django template: Files and directories that are used as skeletons for creating new Django web applications and apps.
Getting Started
I forked the Django project and cloned it into a directory called $django/django.
I then created a branch called django-oscar, and modified
django/conf/app_template and
django/conf/project_template
for a typical django-oscar project.
New Django-Oscar Project
The modified Django app template includes:
-
A
settingsmodule instead of just asettings.pyfile. Provision is made forprod,devandtestconfigurations. manage.pyhas been modified to use thedevconfiguration.
Next time I need to start a new django-oscar project, I will type:
(aw) $ mkdir $django/djangoProject && cd $django/djangoProject (aw) $ django-admin startproject \ --template $django/django/django/conf/project_template \ myProject (aw) $ chmod a+x ./manage.py
New Django-Oscar App
The modified Django app template includes:
-
An
urls.pyfile.
urls.py-tplfrom django.urls import path from . import views urlpatterns = [ path(route='', view=views.index, name='{{ app_name }}.index'), ] -
A modified
apps.py-tplthat subclassesOscarConfiginstead of Django’sAppConfig. -
A
static/directory, where static assets for the app should be placed. Themanage.py collectstaticsubcommand collects all of these static assets and copies them toSTATIC_ROOTfor deployment. -
A
templates/directory, where templates for the app should be placed. -
A
templatetags/directory, where template tags for the app should be placed.
Next time I need to start a new django-oscar app, I could type:
(aw) $ ./manage.py startapp \
--template $django/django/django/conf/app_template \
myApp
However, I also want to insert the new app into the array of INSTALLED_APPS,
so I wrote a little bash script which calls manage.py as shown above, and then inserts the app name into settings.
I stored the bash script as django/extras/addNewAppToInstalledApps:
#!/bin/bash
function help {
printf "$1
$(basename $0) - Add a new Django app name to the top of 'INSTALLED_APPS' in settings.
Usage:
$(basename $0) newAppName
The first letter of newAppName will be appropriately capitalized where necessary.
This script requires that Django be checked out into $django/django
and the Django git project branch be set to django-oscar.
NOTE: If your Django webapp uses corsheaders, ensure that it is the first app listed after this script finishes.
"
exit 1
}
if [ -z "$1" ]; then help "\nError: no Django app name specified.\n"; fi
NEW_APP_NAME="$1"
shift
REGEX='^INSTALLED_APPS ='
SETTINGS_FILE="$(
grep -lrI "$REGEX" . \
--include=\*.py \
--exclude-dir={.git,.idea,.vscode,bin,cache,node_modules} | \
tail -n 1
)"
if [ -z "$SETTINGS_FILE" ]; then
echo "Error: no Python file with contents matching '$REGEX' was found in $(pwd)"
exit 2
fi
if [ -z "$django" ]; then
echo "Error: Please define an environment variable called 'django', pointing to the Django git project."
exit 2
fi
if [ ! -d "$django/django" ]; then
echo "Error: The '$django/django' directory does not exist.
Please clone the Django git project into $django and checkout the 'django-oscar' branch."
exit 2
fi
APP_TEMPLATE="$django/django/django/conf/app_template"
if [ ! -d "$APP_TEMPLATE" ]; then
echo "Error: The '$APP_TEMPLATE' directory does not exist. Please checkout the 'django-oscar' branch in '$django/django'."
exit 2
fi
./manage.py startapp --template "$APP_TEMPLATE" "$NEW_APP_NAME"
sed -i "/$REGEX.*/a \ \ \ \ '${NEW_APP_NAME,,}.apps.${NEW_APP_NAME^}Config'," "$SETTINGS_FILE"
Here is the help message:
$ addNewAppToInstalledApps
Error: no Django app name specified.
addNewAppToInstalledApps - Add a new Django app name to the top of 'INSTALLED_APPS' in settings.
Usage:
addNewAppToInstalledApps newAppName