Добавление пользовательских функций в django методы маршрутизатора - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь добавить пользовательские функции в django методы маршрутизатора.

Это мой маршрутизатор, который предоставляет стандартные методы для пользователя.

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [BasePermission]

Я проверяю пользователь использует методы валидации сериализатора.

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    MOBILE_ERROR = 'Mobile number should be 10 digits long and only contain numbers.'
    EMAIL_ERROR = 'Incorrect email format'
    USERNAME_ERROR = 'Username must be at least 6 characters long and contain only letters and numbers.'

    class Meta:
        model = User
        fields = '__all__'

    def validate_mobile(self, value):
        regexp = re.compile(r'^[0-9]{10}$')
        if regexp.search(value):
            return value
        raise serializers.ValidationError(self.MOBILE_ERROR)

    def validate_email(self, value):
        if validate_email(value):
            return value
        raise serializers.ValidationError(self.EMAIL_ERROR)

    def validate_username(self, value):
        regexp = re.compile(r'^[a-zA-Z0-9]{6,}$')
        if regexp.search(value):
            return value
        raise serializers.ValidationError(self.USERNAME_ERROR)

И это мой маршрут.

router = DefaultRouter(trailing_slash=False)
router.register(r'user', UserViewSet),
urlpatterns = router.urls

Я хочу добавить метод send_activation_code, если пользователь успешно создан. Как мне это сделать?

1 Ответ

1 голос
/ 12 января 2020

Для этой цели вы можете использовать сигналы. Каждый раз, когда ваше приложение создает новый экземпляр User, нужно выполнить какое-то действие. В вашем случае вы должны подключить встроенный сигнал post_save и существующую send_activation_code функцию

Пример для вашего случая:

yourapp / сигналов.py:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def send_activation_code_signal(sender, instance, created, **kwargs):
    if created:
        send_activation_code(instance.phone_number)

Кроме того, вам нужно импортировать сигналы в файл конфигурации вашего приложения

yourapp / app.py:

from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _

class YourAppConfig(AppConfig):
    name = 'yourproject.yourapp'
    verbose_name = _('yourapp')

    def ready(self):
        import yourproject.yourapp.signals

yourapp / __ init__.py:

default_app_config = 'yourproject.yourapp.apps.YourAppConfig'

Если вам не нужно отправлять код каждый раз, когда создается пользовательский экземпляр - вы можете указать больше операторов, например:

if created and instance.validated:
    send_activation_code(instance.phone_number)

Там Вот еще несколько полезных встроенных сигналов в Django, проверьте документы Django Сигналы документов: https://docs.djangoproject.com/en/3.0/ref/signals/

...