Traditionally Django used to delete files when an object was deleted. But since 1.3 (see this post) this isn't true anymore.
Honestly I find this decision annoying because 99.9% of the time, I wanted this exact behaviour. But hell, some people probably more intelligent than me decided it was better otherwise.
Aside from using this solution along with a cron job, I didn't like the workaround I've found so far because they required to either override the save method(s) of on a per model basis or use a custom filestorage.