Django signals are tools to let parts of your app respond when something happens, like saving a model. When an event occurs, Django sends a signal. Receivers that listen to this signal run their code. For example, after saving a new model instance, a receiver can print a message. But signals only work if receivers are connected. If no receiver listens, nothing happens. Also, signals run on many events, so inside the receiver you often check details like if the instance was just created. Signals are good for side effects like sending emails or logging, but avoid using them for main logic because they can make your code harder to understand and debug.