0

I have a signals file that I would like to be run every time a child is created. For some reason, it has created the default information for one child but if another one is added, it does not create the default information. Does not work for other users either, it has for some reason only worked for my account.

signals.py file:

from django.db.models.signals import post_save
from django.dispatch import receiver
from children.models import Children
from .models import Timeline

@receiver(post_save, sender=Children)
def init_new_child(instance, created, raw, **kwargs):
    # raw is set when model is created from loaddata.
    if created and not raw:
        Timeline.objects.create(header = "Financial Support", age = "0-4",children=instance)
        Timeline.objects.create(header = "Financial Support", age = "4-11",children=instance)
        Timeline.objects.create(header = "Financial Support", age = "11-18",children=instance)
        Timeline.objects.create(header = "Financial Support", age = "18-25",children=instance)

        Timeline.objects.create(header = "Educational Support", age = "0-4",children=instance)
        Timeline.objects.create(header = "Educational Support", age = "4-11",children=instance)
        Timeline.objects.create(header = "Educational Support", age = "11-18",children=instance)
        Timeline.objects.create(header = "Educational Support", age = "18-25",children=instance)

        Timeline.objects.create(header = "Governmental Support", age = "0-4",children=instance)
        Timeline.objects.create(header = "Governmental Support", age = "4-11",children=instance)
        Timeline.objects.create(header = "Governmental Support", age = "11-18",children=instance)
        Timeline.objects.create(header = "Governmental Support", age = "18-25",children=instance)

        Timeline.objects.create(header = "Charity Support Groups", age = "0-4",children=instance)
        Timeline.objects.create(header = "Charity Support Groups", age = "4-11",children=instance)
        Timeline.objects.create(header = "Charity Support Groups", age = "11-18",children=instance)
        Timeline.objects.create(header = "Charity Support Groups", age = "18-25",children=instance)

        Timeline.objects.create(header = "Therapy Support", age = "0-4",children=instance)
        Timeline.objects.create(header = "Therapy Support", age = "4-11",children=instance)
        Timeline.objects.create(header = "Therapy Support", age = "11-18",children=instance)
        Timeline.objects.create(header = "Therapy Support", age = "18-25",children=instance)

        Timeline.objects.create(header = "Transport Support", age = "0-4",children=instance)
        Timeline.objects.create(header = "Transport Support", age = "4-11",children=instance)
        Timeline.objects.create(header = "Transport Support", age = "11-18",children=instance)
        Timeline.objects.create(header = "Transport Support", age = "18-25",children=instance)

Children model:

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.urls import reverse



DIAGNOSIS_CHOICES = [
        (1, ("Yes")), 
        (2, ("No"))
]

class Children(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.CharField(max_length=100)
    diagnosis = models.IntegerField(
        choices= DIAGNOSIS_CHOICES,
    )
    disability = models.CharField(max_length=100)
    parent = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.first_name + " " + self.last_name

    def get_absolute_url(self):
        return reverse('children-detail', kwargs={'pk': self.pk})*

Timeline model:

from django.db import models
from django.contrib.auth.models import User
from posts.models import PDF
from children.models import Children

HEADER_CHOICES = [
    ('Financial Support', 'Financial Support'),
    ('Educational Support', 'Educational Support'),
    ('Governmental Support', 'Governmental Support '),
    ('Charity Support Groups', 'Charity Support Groups'),
    ('Therapy Support', 'Therapy Support '),
    ('Transport Support', 'Transport Support ')
]
AGE_CHOICES = [
    ('0-4', '0-4'),
    ('4-11', '4-11'),
    ('11-18', '11-18'),
    ('18-25', '18-25')
]

class Timeline(models.Model):
    header = models.CharField(max_length=30, choices=HEADER_CHOICES)
    age = models.CharField(max_length=6, choices=AGE_CHOICES)
    child = models.OneToOneField(Children, on_delete=models.CASCADE)

class Pdf(models.Model):
    pdf = models.FileField(upload_to='timelinepdfs')
    timeline = models.ForeignKey(Timeline, on_delete=models.CASCADE)

1 Answers1

1

From Django documentation:

Notice that the function takes a sender argument, along with wildcard keyword arguments (**kwargs); all signal handlers must take these arguments.

So, the Django documentation is not explicit whether sender is a keyword argument or positional argument. From looking at the latest 2.2 code, it does seem to be a keyword arg, but it I have only checked one version. You could try adding sender as a first argument.

from children.models import Children
from .models import Timeline, HEADER_CHOICES, AGE_CHOICES

@receiver(post_save, sender=Children)
def init_new_child(sender, instance, created, raw, **kwargs):
    # raw is set when model is created from loaddata.
    if created and not raw:
        # Just a DRY suggestion:
        for header in HEADER_CHOICES:
            for age in AGE_CHOICES:
                Timeline.objects.create(
                    header=header[0],
                    age=age[0],
                    child=instance
                )
Johan Schiff
  • 661
  • 4
  • 13