Personalmente, trovo che usare pycharm IDE aiuta a velocizzare significativamente lo sviluppo di django. Anche nella shell django puoi usare la funzione ipython per ottenere docstring e codice sorgente, digitando qualcosa e seguito da? (informazioni di base) o ?? (codice sorgente). Molto utili sono anche altre funzionalità di ipython come il completamento delle schede (solo un livello).
In [1]: from django.contrib.auth.models import User
In [2]: User ?
Type: ModelBase
Base Class: <class 'django.db.models.base.ModelBase'>
String Form: <class 'django.contrib.auth.models.User'>
Namespace: Interactive
File: /usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py
Docstring:
Users within the Django authentication system are represented by this model.
Username and password are required. Other fields are optional.
Constructor information:
Definition: User(self, *args, **kwargs)
In [3]: User ??
Type: ModelBase
Base Class: <class 'django.db.models.base.ModelBase'>
String Form: <class 'django.contrib.auth.models.User'>
Namespace: Interactive
File: /usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py
Source:
class User(models.Model):
"""
Users within the Django authentication system are represented by this model.
Username and password are required. Other fields are optional.
"""
username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters"))
first_name = models.CharField(_('first name'), max_length=30, blank=True)
last_name = models.CharField(_('last name'), max_length=30, blank=True)
email = models.EmailField(_('e-mail address'), blank=True)
password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts."))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them."))
last_login = models.DateTimeField(_('last login'), default=datetime.datetime.now)
date_joined = models.DateTimeField(_('date joined'), default=datetime.datetime.now)
groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True,
help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True)
objects = UserManager()
class Meta:
verbose_name = _('user')
[...]