Django Scaffolding

We all love Django — a simple but powerful framework. However, Ruby on Rails has at least one (and few others I’m sure!) advantage: scaffolding. It allows developers to create the models, views, and templates in a single operation. It’s an interesting solution — you don’t have to manually create all the things that usually take a lot of time. So why don’t we have this feature in Django? Well… now we do!

Our latest django-common 0.3 comes with a scaffolding feature!

Overview

Here is what django-common scaffold can do:
create app
– create models
– create views
– create templates
– create forms
– create urls
– create tests

Scaffold creates the app (similar to startapp that ships with Django), models with fields, CRUD views with ajax forms, prepares templates, fills urls, and creates CRUD tests with only one command!

Installing

Use pip installer:

pip install django-common-helpers

Or just download/clone directly from github:

https://github.com/Tivix/django-common

Then add it (django_common) to INSTALLED_APPS and set up SCAFFOLD_APPS_DIR in settings.

Default is set to main app directory. However if you use django_base_project you must set up this to SCAFFOLD_APPS_DIR = ‘apps/’.

Run scaffold, run!

To run scaffold type:

python manage.py scaffold APPNAME --model MODELNAME [fields]

APPNAME is the name of the new application. If application already doesn’t exist it will be created.

MODELNAME is the name of the model. Just enter model name that you want to create (for example: Blog, Topic, Post etc). It must be alphanumerical. Only one model per run is allowed!

[fields] – list of the model fields.

Field Types

Available fields:

char - CharField
text - TextField
int - IntegerFIeld
decimal -DecimalField
datetime - DateTimeField
foreign - ForeignKey

All fields requires name that is provided after “:“ sign, for example:

char:title text:body int:posts datetime:create_date

Two fields, “foreign“ and “decimal“ require additional parameters:

– “foreign” as third argument takes foreignkey model, for example:

foreign:blog:Blog, foreign:post:Post, foreign:added_by:User

Notice: All foreign key models must already exist in project. User and Group models are imported automatically.

– decimal field requires two more arguments “max_digits“ and “decimal_places“, for example:

decimal:total_cost:10:2

Notice: To all models scaffold automatically adds two fields: update_date and create_date.

Templates

Scaffold templates use two blocks extending from base.html:

{% extends "base.html" %}
{% block page-title %} {% endblock %}
{% block conent %} {% endblock %}

So be sure you have your base.html set up accordingly.

Example Usage

Let’s create a very simple “forum“ app. We need “Forum“, “Topic“ and “Post“ models.

Forum model
Forum model needs just one field “name“:

python manage.py scaffold forum --model Forum char:name

Topic model
Topics are created by site users so we need: created_by, title and Forum foreign key (update_date and create_date are always added to models):

python manage.py scaffold forum --model Topic foreign:created_by:User char:title foreign:forum:Forum

Post model
Last one are Posts. Posts are related to Topics. Here we need: title, body, created_by and foreign key to Topic:

python manage.py scaffold forum --model Post char:title text:body foreign:created_by:User foreign:topic:Topic

All data should be in place!

Now you must add forum app to INSTALLED_APPS and include app in urls.py file by adding into urlpatterns:

urlpatterns = patterns('',
    ...
    (r'^', include('forum.urls')),
)

Now syncdb new app and you are ready to go:

python manage.py syncdb

Run your server:

python manage.py runserver

And go to forum main page:

http://localhost:8000/forum/

All the structure is in place. Now you can personalize models, templates and urls.

At the end you can test new app by running test:

python manage.py test forum

Creating test database for alias ‘default’…
…….
——-
Ran 7 tests in 0.884s

OK

Happy scaffolding!

Django Scaffolding

Leave a Reply

Your email address will not be published. Required fields are marked *