Как использовать формы Django с использованием Django REST Framework (DRF)?

Как связать Django приложение (магазин) с ботом в Telegram, используя DRF и Djoser, чтобы пользователь регистрировался на сайте и получал письмо подтверждения от Djoser?

Мои существующие попытки, такие как добавление action="{% url 'user-list' %}" в форму, перенаправляют пользователя с URL сайта (/signup) на URL DRF. Хотелось бы найти более адекватное решение без необходимости наследоваться от сгенерированных Djoser'ом представлений или писать свои.

В конфигурации Djoser уже указаны ссылки для сброса пароля и сброса имени пользователя. Мне нужно добавить логику отправки письма с подтверждением активации. Как я могу это сделать?

Пример кода, который я написал для вьюшки подтверждения имейла:

```python
class ActivationView(TemplateView):
    template_name = 'customauth/activation.html'

    def get(self, request, *args, **kwargs):
        requests.post(url=f'http://127.0.0.1:8000/{reverse("user-activation")}', data=request.resolver_match.captured_kwargs)
        return super().get(request, *args, **kwargs)
```

Я использовал requests.post для отправки данных на URL DRF. Но это кажется костыльным решением, и я уверен, что существует лучший способ.
  • 10 ноября 2023 г. 6:30
Ответы на вопрос 1
Есть несколько способов связать Django приложение с ботом в Telegram, используя Django REST Framework (DRF) и Djoser, чтобы пользователь регистрировался на сайте и получал письмо подтверждения от Djoser.

1. Использование DRF для создания пользователей:
   - Создайте сериализатор для пользователей, который будет проверять и сохранять данные пользователя.
   - Создайте представление DRF для создания пользователя, которое будет использовать сериализатор для создания пользователя.
   - Добавьте URL для представления создания пользователя в файле urls.py вашего Django приложения.

2. Использование Djoser для отправки письма с подтверждением активации:
   - Добавьте Djoser в INSTALLED_APPS вашего Django приложения.
   - В настройках Djoser укажите, что вы хотите использовать отправку писем с подтверждением активации.
   - Если вы хотите настроить электронное письмо, которое будет отправлено при подтверждении активации, вы можете создать свой шаблон электронного письма и указать на него путь в настройках Djoser.
   - Убедитесь, что у вас настроено отправка электронных писем из вашего Django приложения.

3. Связывание бота в Telegram с Django приложением:
   - Создайте представление DRF для регистрации пользователя через бота в Telegram. Внутри представления, используйте методы DRF для создания пользователя и отправки электронного письма с подтверждением активации.
   - Создайте телеграм-бота и получите его токен через @BotFather.
   - Используйте python-telegram-bot для создания экземпляра бота в вашем Django приложении, и настройте обработчики команд и событий бота.
   - В обработчиках команд и событий бота, вызывайте представление DRF для регистрации пользователя и отправки письма с подтверждением активации.

Ниже приведен пример кода для отправки письма с подтверждением активации через представление Django:

```python
from django.shortcuts import render
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import EmailMessage
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.contrib.auth.tokens import default_token_generator

from rest_framework.views import APIView
from rest_framework.response import Response

from djoser.conf import settings
from djoser.utils import (
    decode_uid,
    get_user_model,
    send_activation_email,
)

class UserActivationView(APIView):
    def post(self, request):
        token = default_token_generator.make_token(request.user)
        uid = urlsafe_base64_encode(force_bytes(user.pk))
        current_site = get_current_site(request)

        mail_subject = 'Activate your account'
        message = render_to_string('activation_email.html', {
            'user': request.user,
            'domain': current_site.domain,
            'uid': urlsafe_base64_encode(force_bytes(request.user.pk)),
            'token': default_token_generator.make_token(request.user),
        })
        to_email = request.user.email
        email = EmailMessage(
            mail_subject, message, to=[to_email]
        )
        email.send()
        return Response({'success': 'Email sent'})
```

В этом примере мы создаем представление `UserActivationView`, которое будет отправлять письмо с подтверждением активации. Мы используем функцию `send_activation_email` из Djoser для создания и отправки письма с подтверждением активации.

Для добавления информации о регистрации пользователя через бота в Telegram, вы можете передать дополнительные данные через запрос в представление.

Надеюсь, что это поможет
Похожие вопросы