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()