Как использовать сигналы Django при наличии декораторов на основе ролей?

Я пытаюсь добавить сигналы, когда работодатель или администратор/сотрудник создали смену. В настоящее время у меня есть такой вид, мне интересно, как я должен изменить его, чтобы иметь сигнал после сохранения?

@login_required
@admin_staff_employer_required

def createShift(request):
    user=request.user
    employer=Employer.objects.all()
    
    form = CreateShiftForm()
    if request.method == 'POST':
        form = CreateShiftForm(request.POST)

        if form.is_valid():

            form.save()
            messages.success(request, "The shift has been created")

            return redirect('/shifts')
        else:
            messages.error(request,"Please correct your input field and try again")

    context = {'form':form}

    return render(request, 'create_shift.html', context)

Спасибо за помощь!

Необходимо создать новую функцию, которая будет приемником сигнала post-save. Это объясняется здесь в документации: https://docs.djangoproject.com/en/4.1/topics/signals/#connecting-to-signals-sent-by-specific-senders

По сути, вам нужно установить отправителем класс вашей модели, и при каждом сигнале post_save будет срабатывать функция-обработчик. Если вам нужен конкретный сигнал, вы можете создать свой собственный: https://thetldr.tech/how-to-add-custom-signals-dispatch-in-django/, но для вашего случая вы можете запускать функцию при каждом сохранении модели сдвига.

from django.db.models.signals import post_save
from django.dispatch import receiver
#here you have to import your Shift model


@receiver(post_save, sender=Shift)
def my_handler(sender, **kwargs):
    print('Shift created')

Также импортируйте файл сигналов в ваш файл apps.py следующим образом:

from django.apps import AppConfig


class ApplicationConfig(AppConfig):
    name = "<your app name>"

    def ready(self):
        from <app_name> import <signal_recievers_file_name>

Это должно вывести "Shift created" в консоль после создания новой смены.

Попробуйте это (в данном случае я предполагаю, что имя вашего приложения - 'almo', а имя модели - 'Shift').

signals.py

from .models import Shift
from django.dispatch import receiver
from django.db.models.signals import post_save

@receiver(post_save, sender=Shift)
def shift_created_callback(sender, **kwargs):
    print('shift created!')
    # do something

# arguments can be added by your taste
# def shift_created_callback(sender, instance, **kwargs):
# def shift_created_callback(sender, instance, created, **kwargs):

apps.py

from django.apps import AppConfig

class AlmoConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'almo'

    def ready(self):
        import almo.signals

Вы можете увидеть 'shift created' в консоли, когда вы создаете shift

Вернуться на верх