Django was created from a set of scripts developed at a newspaper to publish content on multiple domains; using one single content base.
This is where the “sites” module comes in. Its purpose is to mark content to be displayed for different domains.
In previous versions of django, the startproject script automatically added the django.contrib.sites application to INSTALLED_APPS, and when you did syncdb, a default site with the URL example.com was added to your database, and since this was the first site, its ID was 1 and that’s where the setting comes from.
Keep in mind that starting from 1.6, this framework is not enabled by default. So if you need it, you must enable it
The SITE_ID setting sets the default site for your project. So, if you don’t specify a site, this is the one it will use.
So to configure your application for different domains:
- Enable the sites framework
- Change the default site from
example.comto whatever your default domain is. You can do this from the django shell, or from the admin. - Add your other sites for which you want to publish content to the sites application. Again, you can do this from the django shell just like any other application or from the admin.
- Add a foreign key to the Site model in your object
site = models.ForeignKey(Site) - Add the site manager
on_site = CurrentSiteManager()
Now, when you want to filter content for the default site, or a particular site:
foo = MyObj.on_site.all() # Filters site to whatever is `SITE_ID`
foo = MyObj.objects.all() # Get all objects, irrespective of what site
# they belong to
The documentation has a full set of examples.