часть — 11

Сигналы в Джанго

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

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

Позвольте мне привести вам основной пример:

models.py

from django.db import models
from django.db.models import signals
def 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'

Вы можете избежать этой строки, если добавили ее в свои установленные приложения вместо «пользователей».

Запустите свой сервер и протестируйте, создав новых пользователей.

Следующий..