Я бы сделал так:
1. Как сказали выше
example.org ставится nginx'у как условие направления запросов в приложение. Т.е. любой
pupkin.example.org и
ivanov.example.org уйдут в Джанго на обработку.
2. Создал модель Company в базе данных с индексируемым полем domain.
3. Сделал мидлварь, которая наподобие мидлвари ванильной авторизации выковыривает хост из
request.META, лезет в базу, находит объект компании и прикрепляет его к запросу
setattr(request, 'company', company_instance)
, после этого объект компании можно будет юзать во вьюхах, так же как и юзера:
request.company
4. В случае если в имени хоста нету домена третьего уровня, то я бы сделал
setattr(request, 'main_site', True)
чтобы во вьюхе можно было понять что это основной сайт, а если поддомен передан, но в базе его нет, то я бы сразу вернул редирект на страницу с инфой, что такой компании не существует, или она заблокирована, или еще что, зарегистрируйтесь и будет вам счастье.
5. Автоматическое создание поддомена это лишь создание
Company.objects.create(
owner=some_user,
domain=company_domain,
email=company_email,
...
created=timezone.now()
)
, вопрос только в том, будет ли company_domain генерироваться согласно какому-то принципу, или задаваться админом, или юзером при регистрации, или с потолка или рандом, вариантов как звезд на небе, а вопрос слишком обширный, типа "я хочу сделать сайт как фейспук, шо мне делать".