An important piece to this that isn't mentioned is filing bug reports, good bug reports. If you track down where some fails, figure out why, and find the smallest, easiest set of steps to reproduce, you have helped the developers a lot. Even you don't know how to fix it, or know that the fix is not trivial, the developer now has a great place to start.
I have created several bug reports for Django where I pointed where it fails and even offered "bad" solutions in the description. I rarely provide a true patch because I don't have the latest of Django and rarely have the time to check it out, create a patch and tests. In the few cases that I have, my patch hasn't been used because the developers, in the wisdom, found better solution, usually very similar to mine, but more thought out or handling other cases I wasn't aware of. This doesn't bother me, because the developers are never hostile over proposed solutions, in fact they have been appreciative for the help in a starting point.