Recibiendo la señal de antes de ser guardado, podrías en lugar de señales modificar el método save pero teniendo en cuenta que en algunas operaciones, como al trabajar con múltiples instancias, Django optimiza las consultas y no emplea el método save, tendrás que ver cual es tu caso y que se adapta mejor, de resto es solo antes de guardar si no tiene password asignada que se le genere aleatoriamente y se le asigne, y luego sea guardado:
Código:
from django.db import models
from django.db.models.signals import pre_save
from random import random
class MyModel(models.Model):
passwd = models.CharField()
def mymodel_save_handler(sender, **kwargs):
if sender.passwd == '':
dic = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
_passwd = ''
for i in range(5):
_passwd += dic[int(random()*len(dic))]
sender.passwd = _passwd
pre_save.connect(mymodel_save_handler, sender=MyModel)