What is the standard Django project structure and what does each file do?
When you run django-admin startproject myproject and python manage.py startapp myapp, Django creates a specific directory structure:
Project-level files:
manage.py: Command-line utility for running management commandsmyproject/settings.py: Configuration (database, installed apps, middleware, etc.)myproject/urls.py: Root URL configurationmyproject/wsgi.py: WSGI entry point for production serversmyproject/asgi.py: ASGI entry point for async servers
App-level files:
myapp/models.py: Database models (ORM)myapp/views.py: View functions or classesmyapp/urls.py: App-specific URL patterns (you create this)myapp/admin.py: Admin site registrationmyapp/apps.py: App configurationmyapp/tests.py: Testsmyapp/migrations/: Database migration files
Django follows the apps pattern -- each feature is a self-contained app with its own models, views, and URLs.
myproject/
manage.py <- CLI entry point
myproject/
__init__.py
settings.py <- all configuration
urls.py <- root URL routing
wsgi.py <- production WSGI
myapp/
__init__.py
models.py <- database models
views.py <- request handlers
urls.py <- app URL patterns
admin.py <- admin registration
migrations/ <- schema migrations
templates/myapp/ <- app templates
static/myapp/ <- app static files
# myproject/settings.py (key settings)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp', # your app
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# myproject/urls.py (root URL config)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),
]
# myapp/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# myapp/views.py
from django.http import JsonResponse
from .models import Article
def article_list(request):
articles = Article.objects.all().values('id', 'title', 'created_at')
return JsonResponse({'articles': list(articles)})
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list, name='article-list'),
]
# myapp/admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'created_at')
search_fields = ('title',)
- •Django uses apps pattern -- each feature is a self-contained app
- •settings.py holds all configuration; apps must be in INSTALLED_APPS
- •Root urls.py includes app-level urls.py via include()
- •manage.py is the CLI; wsgi.py/asgi.py for production deployment
- •Forgetting to add your app to INSTALLED_APPS means models and templates are not found
- •App names must be unique across the project
- •templates should be in app/templates/appname/ to avoid naming collisions
- •migrations/ directory must have __init__.py or Django ignores it