Arne Coomans

Explainer: Django's Mapindeling

Explainer: Django's Mapindeling

Als je een nieuw Django-project en -app start, bouwt Django een mapstructuur op. Deze onderverdeling helpt bij de scheiding van opslag en weergave van je data. In deze explainer leg ik uit welke mapstructuur wordt opgezet, en welke aanpassingen je daarin kan maken.

De projectmap

Als je een nieuw project start, maakt Django twee mappen aan: de project-map en de projectbestanden-map. Het commando django-admin startproject project levert dus de volgende mappen op:

project/
|- project/

De projectbestanden-map bevat bestanden die de basis zijn van je Django project. Denk hierbij aan settings.py en urls.py.

De App-map

Als je een app aanmaakt binnen je Django-project, wordt een nieuwe map aangemaakt. Het commando python manage.py startapp app levert de volgende structuur op:

project/
|- app/
|-|- migrations/
|-|- admin.py
|-|- models.py
|-|- tests.py
|-|- views.py

In deze opzet beschrijf je al je views, models en tests in één bestand. Dat kan fijn zijn voor een kleine app, maar op het moment dat je meerdere models gaat beheren vind ik het fijn deze in een map op te nemen.

Models en Views

Daarom maak ik de mappen views, models en tests aan binnen de app-map en verwijder ik de overeenkomende .py-bestanden.

cd app
rm views.py models.py tests.py
mkdir views models tests
touch views/__init__.py models/__init__.py

Hierdoor kan ik voor elk model en view een eigen bestand maken, waardoor het makkelijker is om de code aan te passen waar nodig. Het bestand __init__.py is hierbij wel nodig. In dit bestand geef je aan welke van je views en models in Django beschikbaar moeten zijn. Een __init__.py ziet er bijvoorbeeld zo uit:

from .model import *

Templates

Er is nog geen plek om je templates neer te zetten. In je app maak je een map templates aan. In deze templates-map maak je een map met de naam van je app aan. Met het commando mkdir -p maak je niet alleen de map aan, maar ook alle ontbrekende bovenliggende mappen. Zo kan je dus in één keer beide mappen aanmaken. Naast de template-map is er ook een plek nodig om static bestanden te plaatsen, zoals .css bestanden. Hiervoor maak ik een map static aan.

mkdir -p templates/app static

Templatetags

Soms wil je Django's template uitbreiden met custom templatetags. Ik heb bijvoorbeeld markdown-support toegevoegd via een templatetag. Deze plaats je in een map templatetags. Deze templatetags kan je in je project- of app-directory aanmaken.

Uiteindelijke mapindeling

Na de standaard aanpassingen die ik maak zie mijn Django-project er zo uit:

project/
|- project/
|- app/
|-|- migrations/
|-|- models/
|-|- static/
|-|- templates/
|-|-|- app/
|-|- tests/
|-|- views/
|-|- admin.py
|-|- urls.py

Hier heb ik een uitleg gegeven over Django's mapindeling en beschreven welke aanpassingen ik maak om code overzichtelijk en leesbaar te houden.