Как использовать сигналы 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