Django Signals Not Working Properly

I am trying to configure a signal so that when I save the correct form, a function is executed to perform a related task.

My application structure is as follows:

- events
    - helpers
        - __init__.py
        - status.py
    - models
        - signals
            - __init__.py
            - event.py
        - __init__.py
        - event.py
        - status.py
    - views
        - __init__.py
        - event.py

I believe that signals should be imported as early as possible, in front of the models, so models/__init__.pyI have one at the top from .signals import *.

# views/event.py
class AddEventView(CreateView):
    """
    View for adding an Event.
    """
    model = Event
    form_class = EventForm
    success_url = reverse_lazy('events:all_events')

    def form_valid(self, form):
        self.object = form.save()

        signals.event_status.send(
            sender=None, request=self.request, event=self.object, status=None
        ) # Should the sender be self.object?

        return super(AddEventView, self).form_valid(form)

# signals/event.py
from django.dispatch import Signal
event_status = Signal(providing_args=["request", "event", "status"])

# helpers/status.py
from ..models import Status, StatusHistory
from ..models.signals import event_status


def create_status(sender, **kwargs):
    """
    Create a status for a given event.
    """
    event = kwargs['event']
    status = kwargs['status']
    creator = User.objects.get(pk=event.creator)
    try:
        current_status = StatusHistory.objects.filter(
            event=event).order_by('timestamp')[0]
    except IndexError:
        # Not sure what we're doing here yet.
        pass
    if not status:
        status = Status.objects.get(description=_("Submitted"))

    statushistory = StatusHistory.create(
        event=event,
        event_status=status,
        user=creator
    )
    statushistory.save()

event_status.connect(create_status)

I start the debug server in Pycharm with a breakpoint in the function create_status()and it never hits.

Did I do it wrong?

+5
source share
3 answers

I think you just need to import helpers/status.py, for example, intomodels/__init__.py

event_status ok, create_status Django

, ,

+5

, __init__.py Django APP ( , settings.py, views.py, urls.py...)

__ __ INIT :.

import signals

signals.py:

from django.db.models.signals import post_save, pre_delete 
from django.dispatch import receiver
from my_project.models import *


@receiver(post_save, sender=Modelname)  # Called after an object is saved
def create_modelname(sender, **kwargs):
    obj = kwargs['instance']  # I get the object being saved here
    # ... Here I do whatever I want

@receiver(pre_delete, sender=Modelname)  # Called before an object is deleted
def delete_modelname(sender, **kwargs):
   obj = kwargs['instance']
   # ... Do whatever you need

2 :

  • from django.db.models.signals import post_save, pre_delete
  • from django.dispatch import receiver

  • , import signals __init__.py

, Django, Modelname .

, , , .

+8

I found one case where it signaldoes not work.

Here are the cases when signal(pre_save, post_save) does not happen.

Model.objects.filter(pk=pk).update(key=value)
0
source

All Articles