The following can be used as a base when you want to avoid the normal structure Django imposes on your project, and you just want everything in a single file.
It is based on similar attempts by Ivan Sagalaev and Fahrzin Hemmati (especially this gist), and a post on stack overflow.
A thing that I consider an improvement over Fahrzin Hemmati's version is that models don't need the explicit app_label and __module__.
# # Django as a microframework skeleton, by Allan Boll, 1 May 2012 # Based on http://softwaremaniacs.org/blog/2011/01/07/django-micro-framework/en/ # and https://gist.github.com/2219751 # # # Settings # appname = 'app' from django.conf import settings if not settings.configured: settings.configure( SITE_ID=1, TEMPLATE_DIRS=['.'], DATABASES = { 'default':{ 'ENGINE':'django.db.backends.sqlite3', 'NAME': 'db', } }, DEBUG=True, TEMPLATE_DEBUG=True, ROOT_URLCONF = __name__, STATIC_URL='/static/', STATICFILES_DIRS=['./static/'], INSTALLED_APPS=( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', ) ) # # Models # from django.db import models # Workaround to allow models in current file import sys sys.modules[appname+'.'] = sys.modules[__name__] old_module_name = sys.modules[__name__].__name__ sys.modules[__name__].__name__ = appname+'.' class SomeModel(models.Model): field_name = models.CharField(max_length=10) # Continuation of workaround to allow models in current file sys.modules[__name__].__name__ = old_module_name # # Views # from django.shortcuts import render def index(request): out = [] for obj in SomeModel.objects.all(): out.append(obj.field_name) return render(request, 'index.html', {'s': ', '.join(out)}) # # URL configuration # from django.conf.urls.defaults import patterns, url, include urlpatterns = patterns('', (r'^$', index), ) # # Admin site # from django.contrib import admin from django.contrib.auth.admin import UserAdmin, GroupAdmin from django.contrib.auth.models import User, Group admin.site = admin.AdminSite() admin.site.register(User, UserAdmin) admin.site.register(Group, GroupAdmin) admin.site.register(SomeModel) urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)) ) + urlpatterns # # Running # if __name__=='__main__': # Monkey patch get_app to allow models in current file get_app_orig = models.get_app def get_app(app_label,*a, **kw): if app_label==appname: return sys.modules[__name__] return get_app_orig(app_label, *a, **kw) models.get_app = get_app # Add models in current file to global list of apps models.loading.cache.app_store[type(appname+'.models',(),{'__file__':__file__})] = appname from django.core import management management.execute_from_command_line()