часть — 11
Сигналы в Джанго
Мы добавляли профили через страницу администратора, но мы не хотим, чтобы они использовались в производстве, вместо этого мы хотим, чтобы профиль создавался автоматически с изображением по умолчанию для каждого пользователя (всякий раз, когда пользователь создается). Мы можем сделать это с помощью сигналов в Django.

Сигналы — это утилиты, которые позволяют нам связывать события (создание профиля) с действиями(пользователь создан). Мы можем разработать функцию, которая будет запускаться, когда ее вызывает signal(notify).
Позвольте мне привести вам основной пример:
models.py
from django.db import models from django.db.models import signalsdef create_cookie(sender, instance, created, **kwargs): print "Let's start making cookies now"class Cookie(models.Model): quantity= models.IntegerField() additions= models.TextField()signals.post_save.connect(receiver=create_cookie, sender=Cookie)
Это можно написать с помощью декоратора receiver, присутствующего в django.dispatch.
from django.db import models
from django.db.models import signals
from django.dispatch import receiver
class Cookie(models.Model):
quantity= models.IntegerField()
additions= models.TextField()
@receiver(signals.post_save, sender=Cookie) #sender will be class
def create_cookie(sender, instance, created, **kwargs):
print "Let's start making cookies now"
Оболочка
>>> obj = Cookie(quantity=3, addition='Add Extra choco chips')>>> obj.save() Cooking is called
Сигнал (post_save) испускается всякий раз, когда экземпляр Cookie (sender) сохраняется/создается для create_cookie.
Соединение между отправителями и получателями осуществляется через «диспетчеры сигналов», которые являются экземплярами Signal, через connect метод.
А теперь давайте используем его в нашем проекте, чтобы создать профили для пользователей, и для этого давайте поместим наш код в новый файл под пользователями как signal.py (как рекомендовано документацией django)
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
# A post_save signal received when a User instance is created
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
Функция create_profile создает профиль для экземпляра пользователя, если экземпляр пользователя был создан. Теперь, когда у нас есть профиль для пользователя, нам нужно сохранять его всякий раз, когда пользователь или экземпляр модели профиля создается или обновляется с помощью функция save_profile
Аргументы в create_profile и save_profile аналогичны аргументам post_save. Если вы подавите аргумент sender, функции save_profile и create_profile будут выполняться после того, как любая модель Django выполнит сохранение. метод.
Теперь в users/apps.py
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals #noqa
мы импортируем сигналы в готовую функцию, чтобы избежать циклических зависимостей (поскольку документы django рекомендуют делать это таким образом).
И в users/__init__.py
default_app_config = ‘users.apps.UsersConfig'
Вы можете избежать этой строки, если добавили ее в свои установленные приложения вместо «пользователей».
Запустите свой сервер и протестируйте, создав новых пользователей.
Следующий..