Things I Wish I Had Known About Django Development Before Starting My Company
12. Use `pip freeze` to keep a list of your requirements, and keep that requirements list in your repo. Use virtualenv and virtualenvwrapper to keep your environment clean from other environments. Virtualenvburrito (<a href="https://github.com/brainsik/virtualenv-burrito" rel="nofollow">https://github.com/brainsik/virtualenv-burrito</a>) will help you set it all up.<p>13. You almost never need to write bash scripts. Use django management commands to write scripts that interact with your application. Use fabric and a fabfile to do deploys. Use something like chef or puppet to do machine configuration. Your bin/ folder will turn into an unmaintainable mess very quickly.<p>14. Use south. Yes, it's obtuse, but it gets the job done.<p>15. Use a pre_save hook on all of your models to do full_clean for validation before anything goes to the database. This will save you from cleaning up your data later.<p><pre><code>    from django.db.models.signals import pre_save

    def validate_model(sender, **kwargs):
        if 'raw' in kwargs and not kwargs['raw']:
            kwargs['instance'].full_clean()

    pre_save.connect(validate_model, dispatch_uid='validate_models')
</code></pre>
16. If you're writing a javascript-heavy application, consider all of your options for static asset management before you get too deep. I've used django-compressor, django-pipeline, webassets, and django-gears. None of them are perfect solutions (there still isn't a sprockets-esque one-catch-all solution for django like in the rails world), so consider the pros and cons before you make a choice.<p>edited for formatting