Skip to main content

Correct way to structure your Django 1.4 projects




PS: This post is written assuming you're familiar with Django and at-least have some basic experience trying to set-up a Django project (for learning or for some cool project).

Purpose: To show how to properly set-up your Django1.4 project after seeing other developers getting it wrong (seen it wrongly structured by my mentee, senior developers and junior developers at my firm.).


Django 1.3 Project structure: Initial structure followed by two apps added to the project.
Django 1.3 Project structure: Initial structure followed by two apps added to the project.

Refer above picture, where I shown a Django < 1.4 project structure. (I know, at least Django 1.2 & 1.3 follows this structure).

First tree view is of the initial structure that you will get by calling
$ django-admin startproject Proj
Take a note that manage.py, settings.py, urls.py are in the main folder.
Following  tree display is after creating two apps named app1 & app2. You'll do it as follows

$ ./manage.py startapp app1
$ ./manage.py startapp app2
Those apps are created in the same level as settings.py and manage.py

Django 1.4 Project structure: Initial structure followed by two apps added to the project. And at last a wrong structure that I've seen people adopting.
Django 1.4 Project structure: Initial structure followed by two apps added to the project. And at last a wrong structure that I've seen people adopting.


Now,  Django 1.4 changed this organization slightly. They now make settings.py & urls.py into a separate module (or app, whatever you like) along with added wsgi.py (which can be used as is for your Apache wsgi configuration, in most cases).

First tree view shows basic project structure after createproject.
~/Django1.4/bin/ $ django-admin.py createproject Proj
Note that an module called Proj is created with settings.py, urls.py and wsgi.py within Proj main folder.
You can rename main folder to anything you wanted (or keep it as it is).

Also note that manage.py is still kept at higher level (although Django1.4's manage.py is different from from the manage.py found in earlier Django releases).

Following tree display is obvious & correct way to structure your project. It's result after running startapp to create two applications app1 & app2.
~/Project/ $ ./manage.py startapp app1
~/Project/ $ ./manage.py startapp app2
Now app1, app2 and Proj modules will be available to each other if outer Proj folder is in python path.
Which will be in path, because manage.py is kept at outer Proj folder and runserver will do the necessary. Here every apps and django settings & routing are kept as separate modules. Isn't this great?
Well, I like it, it help me better organize things and was so obvious for me from start.


Just to show how others get it wrong by emulating previous project structuring - i.e.,your apps laying beside settings.py, urls.py and all (you know, we hate change :-/ ) -  see the last tree view.
Now, you have one app/module called Proj and your supposed to be apps app1 & app2 are - well correctly speaking - become sub-modules of your app called Proj.

Does it make sense now! Well then I succeeded, if not go and read from beginning, shoot me a mail, leave a comment or abuse (at least show some passion; eventhough I'm going to delete most of 'em anyway). 
Caution: Some might even try to copy manage.py into Proj module ;-)


Update:  An attempt to make it a screen cast happen just after posting this. I know there're lots of rough edges out there. Please bare with me and provide constructive feed-backs.
Find it at YouTube Or Vimeo

Comments

Popular posts from this blog

AJAX File Upload with Web2py

It was not that long, since I experienced a problem while trying to upload a file using an ajax  trapped form. I thought, it must be me doing something wrong. I was using web2py  to embed another page into a page via ajax. That is better known to web2py folk as LOADing a component. It's just happened that one of such component contains a file upload form. It was my first time using LOAD function provided by web2py. Basically it make use of jQuery to load the page via ajax into a target div and traps input of any form in that page, so that page doesn't reload. Oh, I forgot to say that web2py is bundled with jQuery. It's always boring and tedious to understand a problem without experiencing it. So, Let's play with an example, (PS: I"m using web2py a full stack python framework, but you can use any language at server side and this problem will be there because, it's a problem with ajax) My mod...

My First Python Program

I am very glad today. Because I finally wrote a python program all by myself. I am programming for about 3 years. Of which 2 are using C++ (Old standard and using Turbo C++ IDE ver 3.0 and yet to master Templates and STL. [:-p]) and After starting python using Dive into Python an excellent book by Mark Pilgrim during my 1st year summer vacation, and I only completed Data Structure section. Then I found an excellent Java tutorial by Sang Shin and obtained a certificate by completing First and basic course in Java. Now I am working with My Friend to develop applications in java. We established a web site already. He started programming when he is in 10, ie. more than 2 years of experience. He has Visual Basic too in his side. Now he is doing with JSP and I am concentrating on Python, Ruby (yet to start) and CSS. Today My pleasure is that I completed a python program myself. Which is asked to do in ' A byte of Python ' by Swaroop.C.H. Which is a command line program; and he...

My Conky Configuration File

Edit :                         (Aug 17, 2013) All my configurations including conky's are now hosted at  https://github.com/kra3/dot_files I've been hearing about this conky for a long time. I think I tried it once in my 5 years of linux experience. But, I haven't experienced it till last day. Conky is a system monitor originally based on torsmo! What the heck is this "torsomo"? Honestly, I don't know. Le me google that for you.... Torsmo is a system monitor that sits in the corner of your desktop. It's very simple, customizable and it renders only text on the desktop (and percentagebars if you want it to ;) and the only lib it uses is Xlib. Torsmo can show various information about your system and it's peripherals, including: Kernel version Uptime System time Network interface information Memory and swap usage Hostname Machine, i686 for example System name, Linux for exampl...